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
});