У меня есть проект AngularJS, который использует Karma для запуска некоторых модульных тестов в браузере. Я использую mocha как тестовую структуру.
Тем не менее, у меня есть некоторые тесты спецификаций, которые необходимо прочитать некоторые файлы 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.
Сначала я предположил, что это могло быть превышение времени ожидания, принимая много времени для загрузки, но файл только 95KB.
Далее, я задавался ли интерфейс пользовательского обещания (.success
и .error
) для $http
разрывался метод $q.all
. Но, видимо, нет.
Наконец, я попытался сделать отдельный запрос для /base/static/assets/json/cards/admissions.json
в начале всех испытаний.
Он возвращает обещание, как и ожидалось, но оно никогда не разрешается, потому что ответ не отправляется обратно. Я проверил сетевые инструменты, чтобы узнать, что возвращается, и выясняется, что запрос даже не сделан в первую очередь. Код определенно работает, но по какой-то причине $http
на самом деле не делает запрос.
Моя склонность состоит в том, что это как-то связано с перехватом Угловых Mocks $http
запросов на собственное обслуживание $httpBackend
. Как я могу обойти это?