Angular / Karma - $http.get не выполняется

У меня есть проект AngularJS, который использует Karma для запуска некоторых модульных тестов в браузере. Я использую мокко в качестве основы теста.

Тем не менее, у меня есть некоторые тесты спецификаций, которые должны прочитать некоторые файлы JSON и проверить, соответствуют ли они определенной спецификации соглашения (типы, соглашение об именах и т. Д.).

Я должен дать понять, что именно содержимое этих файлов я хочу проверить. Не поддельная версия их через Angular Mock's $httpBackend,

Я отмечаю файлы JSON для обслуживания в karma.conf.js,

files: [
  { pattern: 'static/assets/json/cards/*.json', included: false, served: true },
  'path/to/angular.js',
  'path/to/angular-mocks.js',
  'tests/**/*.js'
]

Если я бегу karma startЯ могу перейти к /base/static/assets/json/cards/something.json и посмотреть, что файлы обслуживаются.

Далее в моем тесте оба $http и $q услуги вводятся.

var $http, $q;

beforeEach(module('chai'));
beforeEach(inject(function(_$http_, _$q_) {
  $http = _$http_;
  $q = _$q_;
}));

Затем я пытаюсь загрузить каждый ресурс, используя $http.get, Наконец, обещания вернулись из $http.get сопоставлены и призыв к $q.all сделано для того, чтобы дождаться их завершения, перед тем как звонить done() и двигаться дальше.

it('should load the resources', function(done) {
  var promises = ['admissions.json', 'discharge.json']
  .map(function(resource) {
    console.log('Loading', resource);
    return $http.get('/base/static/assets/json/cards/' + resource);
  });

  $q.all(promises)
  .then(function(card) {
    console.log('Success');
    done();
  }, function(err) {
    console.log('Failure', err);
    done();
  });
});

Когда мои тесты запускаются, я вижу следующий вывод консоли:

Loading admissions.json
Loading discharge.json
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.

Сначала я предположил, что он мог превысить тайм-аут, занимая много времени для загрузки, но размер файла составляет всего 95 КБ.

Далее мне стало интересно, есть ли интерфейс пользовательского обещания (.success а также .error) за $http ломал $q.all метод. Но, видимо, нет.

Наконец я попытался сделать отдельный запрос на /base/static/assets/json/cards/admissions.json в начале всех тестов.

Он возвращает обещание, как и ожидалось, но оно никогда не разрешается, поскольку ответ не отправляется обратно. Я проверил сетевые инструменты, чтобы увидеть, что возвращалось, и оказалось, что запрос вообще не был сделан. Код определенно работает, но по какой-то причине $http на самом деле не делает запрос.

Я склоняюсь к тому, что это как-то связано с перехватом Angular Mocks $http запросы на его собственное $httpBackend оказание услуг. Как я могу обойти это?

1 ответ

Я нашел решение в этом блоге. Проблема в том, что вы должны добавить дайджест области, даже если вы не тестируете контроллеры.

it('does a thing one way', function() {
    var value;
    deferred.promise.then(function(_value_) {
        value = _value_;
    });
    deferred.resolve(10);
    expect(value).not. toBe(10); // not yet 10 because $digest hasn't run
    $scope.$digest();
    expect(value).toBe(10); // 10 because $digest already ran
});
Другие вопросы по тегам