Угловой макет $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 18

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

Очень запутанное сообщение об ошибке, не очень легко связанное с проблемой снизу.

У меня была та же проблема, потому что я забыл определить ответ для каждого ожидаемого запроса. Если нет ответа, то нечего и смывать. Кроме того, обещание http никогда не разрешится и не потерпит неудачу.

У меня такое же исключение, потому что я использовал модуль ngMockE2E вместо модуля ngMock. Даже вызов $rootScope.$digest () не помог.