2014-03-06 9 views
17

Nach der offiziellen Führung bei angularJS $httpBackend spülen ich diesen Test machen würde, aber Karma gib mir diesen Fehler: 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'); 
}); 

});

für diese einfachen Controller:

'use strict'; 

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

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

});

+0

ist es eine Warnung oder ein Fehler? – madhured

+0

@madhured Es ist ein Fehler – Tres

Antwort

27

Die _$httpBackend_ hat nichts zu löschen, weil Sie keine HTTP-Anfrage in Ihrem Test machen.

Sie müssen einen Code aufrufen, der eine HTTP-Anfrage erstellt.

Sobald irgendwo in Ihrem Test irgendwo eine HTTP-Anfrage gemacht wurde, können Sie die flush Methode aufrufen, so dass eine Antwort für die Anfrage bereitgestellt wird.

Etwas wie:

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

gleiches Problem mit mir passiert, und das Problem war nicht, dass ich keinen Antrag machte, sondern weil die Anfrage ich machte war anders als das erwartete man:

Für Beispiel habe ich diese Erwartung definiert:

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

Und ich beantrage diese andere URL:

http://myapi.com/002 

Sehr verwirrende Fehlermeldung, nicht wirklich leicht mit dem darunterliegenden Problem verbunden.

+0

gleichen Problem hier, aber ich kann nicht erraten, die URL ich anfrage. Woher weißt du das? Es gibt eine Möglichkeit, auf Logs oder etwas zu zeigen? – Ruben

+0

Danke dafür, ich versuchte herauszufinden, warum mein Code keine http-Anfrage gestellt hat, wenn es offensichtlich hätte sein sollen. Es stellte sich heraus, dass ich nur einen Tippfehler in der 'expectPOST'-URL hatte. –

1

Ich hatte das gleiche Problem, weil ich es versäumte, eine Antwort für jede erwartete Anfrage zu definieren. Ohne Antwort wird nichts gespült. Auch das http Versprechen würde niemals auflösen oder fehlschlagen.

0

Ich habe die gleiche Ausnahme, weil ich ngMockE2E-Modul anstelle von ngMock-Modul verwendet habe. Selbst der Aufruf von $ rootScope. $ Digest() half nicht.