2013-08-27 20 views
5

Ich habe die folgenden Komponententests, und aus irgendeinem Grund macht der zweite Test andere Tests fehlschlagen.AngularJS Jasmine Unit Tests

beforeEach(inject(function ($rootScope, _$httpBackend_, $controller, $location, mockedResource) { 
    scope = $rootScope.$new(); 
    httpBackend = _$httpBackend_; 
    locationService = $location; 

    ctrlDependencies = { 
     $scope: scope, 
     resource: mockedResource, 
    } 

    var ctrl = $controller('myController', ctrlDependencies); 
})); 

it('should redirect to a new page', function() { 
    scope.pageRedirectFunction(); 
    expect(locationService.path()).toBe('/newpage') 
}); 

it('should delete an epic resource', function() { 
    httpBackend.expectGET('/api/v1/epic/1').respond({}); 
    httpBackend.expectDELETE('/api/v1/epic/1').respond({}); 

    // Run the deletion function 
    scope.deleteEpicResource() 

    httpBackend.flush() // This line seems to be the rebelious one 

    expect(scope.epicResources.length).toEqual(0) 
}) 

Ich habe es geschafft, die Linie, um herauszufinden, dass die Fehler zu verursachen scheint, und es ist die httpBackend.flush() Linie. Warum verursacht die Flush-Funktion seltsames Verhalten?

Der eigentliche Fehler, den ich aus Ausführen des Befehls karma start im Terminal erhalten, ist:

Delaying execution, these browsers are not ready: Chrome 29.0 .... 

nach einer Weile, stürzt die Chrome-Sitzung dann.

+0

Welchen Fehler haben Sie bekommen? Ohne das kann niemand es überhaupt erraten. – zsong

+0

Natürlich! Was für ein schrecklicher Fehler. Update mit dem Fehler jetzt ... – Sneaksta

+0

Versuchen Sie Karma Log-Level zu debuggen, um zu sehen, was passiert. – madhead

Antwort

2

eine wenig bekannte Spitze über das Testen/spöttische Asynchron-Anfragen mit Jasmin und AngularJS:

Wenn Sie nicht explizit die Anforderung Aufruf in Ihrem Test (dh es durch eine andere Funktion aufrufen), wird die Anforderung nicht von Angular verdaut werden, so dass er es so erscheinen lässt, wenn die Anforderung nie gefeuert (wenn Sie flush() nennen)

Versuchen scope.$digest() vor Ihrer httpBackend.flush() Anruf ausgeführt wird, dass kann den Trick machen. Weitere Informationen finden Sie unter this thread.

+0

Ich habe das vor einer Weile repariert, aber ich konnte mich nicht daran erinnern, wie ich es behoben habe es. Als ich Ihre Antwort gelesen hatte, wurde mir klar, dass ich für alle Anfragen, die ich brauchte, flush() nicht anrief. Dies war hauptsächlich ein Problem, da API-Anfragen geladen wurden, sobald mein Controller geladen wurde, aber ich hatte sie vergessen. – Sneaksta

+0

Wird durch das Hinzufügen von $ digest() das Problem mit dem Absturz von Chrome behoben? – kfitzpatrick

0

Haben Sie angular-mocks.js vor Ihren Tests? können Sie auch versuchen ngMocks Modul zu laden:

beforeEach(module("ngMock")); 
Verwandte Themen