2016-04-05 10 views
1

Ich versuche, meinen Controller mit Jasmin zu testen. Wenn der Controller erstellt wird, ruft er im Grunde einen Dienst auf, um eine http-Anfrage zu stellen. Ich verwende httpBackend, um die gefälschten Daten zu erhalten. Wenn ich versuche, den Test auszuführen, erhalte ich immer den Fehler "Keine ausstehende Anfrage zum Löschen". Wenn ich die httpBackend.flush() entfernen, schlägt der Test fehl, da controller.data.name nicht definiert ist. Kann jemand wissen, warum es so passiert? Vielen Dank.Kann httpBackend nicht für ngMockE2E flush

Der Code für das Modul ist hier:

var myModule = angular.module('myModule', ['ngMockE2E']); 
myModule.run(function($httpBackend){ 
    $httpBackend.whenGET('/Person?content=Manager').respond(function(){ 
    var response = {'name':'Bob','age':'43'} 
    return [200,response]; 
    }) 
}); 

Der Code für den Service:

myModule.factory('myService',function($http){ 
    return { 
     getData: function(position){ 
      return $http.get('/Person?content='+position); 
     } 
    } 
}); 

Der Code für Controller:

myModule.controller('myController',function(xrefService){ 
    var _this = this; 
    _this.data ={}; 
    _this.getData = function(position){ 
     myService.getData(position).then(function(response){ 
      _this.data = response.data 
     }); 
    } 
    _this.getData("Manager"); 
}) 

Der Code der testen Controller ist:

describe("Test Controller",function(){ 
    var controller,httpBackend,createController; 
    beforeEach(module('myModule')); 
    beforeEach(inject(function($controller,$httpBackend){  
     createController = function(){ 
     return $controller('myController'); 
     } 
     httpBackend = $httpBackend;  
    })); 
    it("should return data",function(){ 
     controller = createController(); 
     httpBackend.flush(); 
     expect(controller.data.name).toEqual("Bob"); 
    });  
}) 

Antwort

0

Sie $ httpBackend.whenGET innen „Der Code für das Modul“

verwenden Sie wie folgt $ httpBackend innerhalb des Testcode verwenden ...

it("should return data",function(){ 
    $httpBackend.expectGET('/Person?content=Manager').respond(function(){ 
     var response = {'name':'Bob','age':'43'} 
     return [200,response]; 
    }) 
    controller = createController(); 
    httpBackend.flush(); 
    expect(controller.data.name).toEqual("Bob"); 
});  

auch rate ich mit expectGET anstelle vongetGET.

Mit whenGET sagen Sie, wenn die Anfrage gemacht wird, dann Antwort wie folgt.

Mit expectGET Sie sagen ... eine Anfrage wird gemacht werden, wenn es so beantwortet wird, wenn die Anfrage nicht gemacht wird, dann scheitern den Test.

PS Wenn Sie einige console.log-Anweisungen in Ihren Controller-Code einfügen, sollten Sie diese Protokollanweisungen sehen, wenn Sie Ihre Testsuite ausführen. Wenn nicht, dann wissen Sie, dass Ihr Controller-Code nicht einmal getroffen wird.

auch verwenden ..

afterEach(function() { 
     httpBackend.verifyNoOutstandingExpectation(); 
     httpBackend.verifyNoOutstandingRequest(); 
}); 

die Testfehler zwingen wird, wenn die Erwartungen nicht erfüllt waren.

+1

Dank danday74, es funktioniert jetzt. Allerdings frage ich mich, ob es überhaupt möglich ist, expectGET(). Respond() in der Testmethode zu verwenden. Da muss ich den Dienstcode lesen, um den Controller zu testen. Zum Beispiel möchte ich nur testen, ob controller.data nicht leer ist (was bedeutet, dass es einige Daten vom Backend empfängt). – Steven

+0

jetzt deine Gedanken :) ja du willst einen Jasmine Spion benutzen. http://ng-learn.org/2014/08/Testing_Promises_with_Jasmine_Provide_Spy. – danday74

+0

spyOn (myService, 'getData').callFake (function() { var def = $ q.defer(); def.resolve (YOUR_MOCK_HTTP_RESPONSE); Rückgabe def.Promise; }); \t expect (myService.getData) .toHaveBeenCalled(); – danday74

1

Die angular documentation sagt folgendes über $ httpbackend für ngMockE2E:

Zusätzlich wollen wir nicht manuell Anfragen zu spülen haben verspottet aus wie wir während der Unit-Tests zu tun. Aus diesem Grund spült das e2e $ httpBackend automatisch Anfragen aus, die das Verhalten des XMLHttpRequest-Objekts genau simulieren ( ).

Also, kurze Antwort: es existiert nicht und Sie brauchen es nicht.

Verwandte Themen