1

У меня есть проект 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. Как я могу обойти это?

ответ

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^