Угловой макет $httpBackend не дает ожидающего запроса на сброс
Следуя официальному руководству по адресу angularJS $httpBackend я сделаю этот тест, но карма даст мне эту ошибку :
Error: No pending request to flush !
at Function.$httpBackend.flush
Тест
'use strict';
describe('profileCtrl', function () {
var scope, $httpBackend;
beforeEach(angular.mock.module('maap'));
beforeEach(angular.mock.inject(function($rootScope, $controller, _$httpBackend_){
$httpBackend = _$httpBackend_;
$httpBackend.when('GET', 'profile').respond([{id: 1, name: 'Bob'}]);
scope = $rootScope.$new();
$controller('profileCtrl', {$scope: scope});
}))
it('should fetch list of users', function(){
$httpBackend.flush();
expectGET(scope.current_user.length).toBe(1);
expect(scope.current_user[0].name).toBe('Bob');
});
});
Для этого простого контроллера :
'use strict';
angular.module('maap').controller('profileCtrl', function($scope, UserService) {
$scope.current_user = UserService.details(0);
});
4 ответа:
_$httpBackend_
нечего сбрасывать, потому что вы не делаете никаких http-запросов в своем тесте.Вам нужно вызвать некоторый код, который делает запрос http.
Затем, как только что-то где-то сделало запрос http в вашем тесте, вы можете вызвать метод
flush
так, чтобы ответ был предоставлен на запрос, который был сделан.Что-то вроде:
it('should fetch list of users', function(){ // Do something that will make an http request MyService.getAllUser(function ...) // for example // Then provide a response for the http request that // has been made when getAllUser was called $httpBackend.flush(); // Check the expected result. expect(something).toBe('Bob'); });
Со мной случилось то же самое, и проблема была не в том, что я не делал запрос, а потому, что запрос, который я делал, отличался от ожидаемого:
Например, я определил это ожидание:
mockBackend.expectGET("http://myapi.com/001").respond("RESULT");
И я запрашивал этот другой URL:
http://myapi.com/002
Очень запутанное сообщение об ошибке, не очень легко связанное с проблемой снизу.