Я пытаюсь проверить службу в Angular, которая использует $ http, но через приблизительно 5 секунд (время ожидания жасмина) я получаю:
Ошибка: Тайм-аут - обратный вызов Async не вызывается в течение таймаута, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL.
Ошибка: Тайм-аут - обратный вызов Async не вызывается в течение таймаута, указанного jasmine.DEFAULT_TIMEOUT_INTERVAL.
Я пробовал использовать $ rootScope. $ Digest(), но это, похоже, не имело никакого значения. Тесты (и код приложения) написаны в машинописном машинописном тексте, и код действительно работает в реальном приложении.
Я не вижу предупреждение/журнал, говорящий, что then() выполнил, но мне удалось получить предупреждение с помощью setTimeout() в тесте (никаких изменений в приложении), но я все еще получал ошибки.
Тестовый код
var $httpBackend, orderSearchService;
beforeEach(inject((_$httpBackend_, _orderSearchService_) => {
$httpBackend = _$httpBackend_;
orderSearchService = _orderSearchService_;
$httpBackend.expectGET("http://testUrl/api/search/testquery");
$httpBackend.whenGET("http://testUrl/api/search/testquery").respond(200, "testData");
}));
it("can call $http and retrieve results",(done) => {
orderSearchService.search("testquery").then(promise => {
var results = promise.data;
alert(results);
expect(results).toBe("testData");
$httpBackend.flush();
done();
});
});
Выписка из службы:
public search(term: string): angular.IPromise<any> {
var result: angular.IPromise<any> = this.httpService.get("http://testUrl" + "/api/search/" + term)
.success((data: any) => { return data });
return result;
}
Я понимаю, что тест должен вызывать search(), и что Жасмин должен ждать выполнения done() для вызова.
После перевода на JavaScript он будет выглядеть следующим образом (поскольку $httpBackend.flush()
запускает цикл дайджеста внутри), я также извлекаю параметры запроса для объекта, чтобы остановить DRY- нарушение
angular
.module('app', [])
.service('orderSearchService', function($http) {
this.search = function(term) {
return $http.get("http://testUrl" + "/api/search/" + term).success(function(data) {
return data;
})
}
});
describe('orderSearchService', function() {
var $httpBackend, orderSearchService;
beforeEach(module('app'));
beforeEach(inject(function(_$httpBackend_, _orderSearchService_) {
$httpBackend = _$httpBackend_;
orderSearchService = _orderSearchService_;
}));
it("can call $http and retrieve results", function() {
var query = {
q: 'testquery',
response: 'testData'
};
$httpBackend.expectGET(/http:\/\/testUrl\/api\/search/);
$httpBackend.whenGET(new RegExp('http://testUrl/api/search/' + query.q)).respond(200, query.response);
orderSearchService.search(query.q).then(function(promise) {
var results = promise.data;
expect(results).toBe(query.response);
});
$httpBackend.flush();
});
});
<link href="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" />
<script src="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-mocks.js"></script>
$httpBackend.flush()
внутри, который был недоступен для Angular, посколькуthen
выполняется послеflush()