web-dev-qa-db-fra.com

Angular mock $ httpBackend ne donne aucune demande en attente de vidage

En suivant le guide officiel à angularJS $ httpBackend Je vais faire ce test, mais Karma me donne ceci error: Error: No pending request to flush ! at Function.$httpBackend.flush

Test

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

});

pour ce simple contrôleur:

'use strict';

 angular.module('maap').controller('profileCtrl', function($scope, UserService) {

$scope.current_user = UserService.details(0);

});

19
Tres

Le _$httpBackend_ n'a rien à vider car vous ne faites aucune requête http dans votre test.

Vous devez appeler du code qui fait une demande http. 

Ensuite, une fois qu'une requête http a été créée quelque part quelque part dans votre test, vous pouvez appeler la méthode flush afin qu'une réponse soit fournie pour la requête qui a été effectuée.

Quelque chose comme: 

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

Le même problème m'est arrivé et le problème n'était pas que je ne faisais pas de demande mais parce que la demande que je faisais était différente de celle attendue:

Par exemple, j'ai défini cette attente: 

mockBackend.expectGET("http://myapi.com/001").respond("RESULT");

Et je demandais cette autre URL:

http://myapi.com/002

Message d'erreur très déroutant, pas vraiment facilement lié au problème de dessous.

10
fguillen

J'ai eu le même problème, car j'ai négligé de définir une réponse pour chaque demande attendue. Sans réponse, il ne reste plus rien à vider. De plus, la promesse http ne serait jamais résolue ou échouée.

1
Andrew Craswell

J'ai la même exception car j'ai utilisé le module ngMockE2E au lieu du module ngMock. Même appeler $ rootScope. $ Digest () n'a pas aidé.

0
Daneel S. Yaitskov