2016-04-05 1 views
1

J'essaie de tester mon contrôleur à l'aide de jasmin. Fondamentalement, lorsque le contrôleur est créé, il appelle un service pour effectuer une requête http. J'utilise httpBackend pour obtenir les fausses données. Lorsque j'essaie d'exécuter le test, je reçois toujours l'erreur "Aucune demande en attente de vidage". Si je supprime le httpBackend.flush(), le test échoue car controller.data.name n'est pas défini. Quelqu'un peut-il savoir pourquoi cela arrive comme ça? Merci.Impossible d'utiliser le vidage httpBackend pour ngMockE2E

Le code du module est ici:

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

Le code pour le service:

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

Le code pour le contrôleur est:

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

Le code pour tester la le contrôleur est:

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

Répondre

0

vous utilisez httpBackend.whenGET $ à l'intérieur "Le code pour le module"

vous devriez utiliser httpBackend $ à l'intérieur du code de test comme suit ...

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

aussi je conseillerais à l'aide AttendezGET au lieu de whenGET.

Avec whenGET vous dites si la demande est faite, alors la réponse est comme ça. Avec expectGET vous dites ... une demande sera faite, quand elle est faite répondre comme si, si la demande n'est pas faite alors échouer le test. Si vous mettez des instructions console.log à l'intérieur du code de votre contrôleur, vous devriez voir ces instructions lorsque vous exécutez votre suite de tests. Sinon, vous savez que votre code de contrôleur n'est même pas touché.

également utiliser ..

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

qui forcera l'échec de test si les attentes ne sont pas remplies.

+1

Merci danday74, ça marche maintenant. Cependant, je me demande si nous pouvons éviter d'utiliser expectGET(). Respond() dans la méthode de test. Puisque cela signifie que j'ai besoin de lire le code de service pour tester le contrôleur. Par exemple peut-être que je veux juste tester si controller.data n'est pas vide (ce qui signifie qu'il reçoit des données du backend). – Steven

+0

maintenant vous pensez :) ouais vous voulez utiliser un espion Jasmine. http://ng-learn.org/2014/08/Testing_Promises_with_Jasmine_Provide_Spy. – danday74

+0

spyOn (myService, 'getData'). Et.callFake (function() { var def = $ q.defer(); def.resolve (VOS_MOCK_HTTP_RESPONSE); return def.promise; }); \t attend (myService.getData) .toHaveBeenCalled(); – danday74

1

Le angular documentation dit le texte suivant à propos httpbackend $ pour ngMockE2E:

De plus, nous ne voulons pas avoir la main pour débusquer émulés demandes comme nous le faisons lors de tests unitaires. Pour cette raison, le e2e $ httpBackend vide automatiquement les requêtes simulées, en simulant de près le comportement de l'objet XMLHttpRequest.

Donc, réponse courte: il n'existe pas et vous n'en avez pas besoin.