2

Ich benutze angular js und ich habe eine controller.js, für die ich Jasmin Testfall schreiben möchte. Ich kann die Funktion des Controllers in meinem Testfall aufrufen. Es gibt eine lokale Funktion in meinem Controller, die durch Methode im Geltungsbereich aufgerufen wird (für die ich einen Testfall schreibe), die eine Service-Methode mit einer Jax-Anforderung aufgerufen hat. $ Httpbackend

(function() { 
    'use strict'; 
    angular 
     .module('coApp') 
     .controller('NewController', [ 
     '$http', 
     '$q', 
     '$log', 
     '$modal', 
     '$scope', 
     'AgentDataLoader', 
     '$timeout', 
     NewController]); 

    function NewController ($http, $q, $log, $modal, $scope, $state, $rootScope, $filter, AgentDataLoader, $timeout) { 

     //Some variables declarations 

     //some methods 
     function myMethod($filter, a, b) { 
      console.log("inside myMethod"); 
      if (angular.isDefined(a) && angular.isDefined(b)) { 
       console.log("inside if "); 
       console.log("a:: "+a); 
       console.log("b:: "+b); 

       dataLoader.callPOST(a, b) 
        .then(function (data) { 
        console.log("Data from service :: "+JSON.stringify(data)); 
        /**calling some directive and methods 
         I am unable to execute this since I am unable to mock http Post of above mentioned dataLoader 
        **/ 

       console.log("after http request"); 
      } else { 
       //some other logic 
      } 
     } 



     $scope.methodToBeTested= function (randomData) { 
      console.log("selectedSystems called ****** "); 
      //some logic 
myMethod($filter, $scope.a, $scope.b); 

     }; 
})(); 
mit

My Jasmine Testsuite

describe('NewController',function(){ 
    var ctrl, scope, $httpBackend, $compile, parameters; 
    beforeAll(function (done) { 

    });  


    beforeEach(function() { 
     module('MYmODULE'); 
     module('myServiceModule'); 
    }); 

    beforeEach(inject(function ($controller, _$httpBackend_, $rootScope, _$compile_) { 
     scope=$rootScope.$new(); 
     $compile = _$compile_; 
     $httpBackend = _$httpBackend_; 
     ctrl=$controller('NewController',{$scope: scope}); 
     // Start listening to xhr requests 

     //This data i want to send as a success of httpBackEnd Post 
     success.data = JsonData; 

     console.log('Setting request in $httpBackend'); 

     //Not working 
     $httpBackend.whenPOST('/abc/efg').success(function(method, url, data) { 
      console.log("Getting sample data from httpBackend :: "+url); 
      return [200, success.data, {}]; 
     }); 

     //Not working 
     $httpBackend.whenPOST('abc/efg').respond(function(method, url, data, headers){ 
      console.log('Received these data:', method, url, data, headers); 
      phones.push(angular.fromJson(data)); 
      return [200, {}, {}]; 
     }); 

     $httpBackend.flush();  
    })); 

    it("Testing myMethodToBeTested of the page", function(){ 
     scope.randomData=someRandomData; 
     expect(scope.methodToBeTested(scope.randomData)); 

     //Tried this also not working 
     $httpBackend.expectPOST('/abc/efg').respond(success.data); 

     afterEach(function() { 
    }); 
}); 
+0

ändern Sie Statuscode 201, wie es Post Anruf –

Antwort

0

Ich bin nicht in der Lage diese HTTP POST-Anforderung in meinem Testfall zu verspotten Für Sie Sie Testcase-Klage haben die Antwortdaten zu verspotten . Ich denke, in dem oben genannten Code sehe ich nicht, dass die Erfolgsvariable irgendwo initialisiert wird. Wenn Sie also die erwartete Antwort erhalten wollen, müssen Sie das erwartete Objekt in Success Variablen zuweisen (basierend auf dem obigen Code geschrieben), wie zB:

var Success = {data:{SomeKey:"value"}} 

Nun müssen Sie diese Variable in der/GET POST Pass anfordern . Wie

$httpBackend.expectPOST('/abc/efg').respond(Success.data); 

this helps :)