2015-06-05 8 views
14

Ho il seguente controller ViewMeetingCtrl.jsspiare una chiamata di metodo di servizio utilizzando Spies gelsomino

(function() { 
    'use strict'; 
    angular.module('MyApp').controller('ViewMeetingCtrl', ViewMeetingCtrl); 

    ViewMeetingCtrl.$inject = ['$scope', '$state', '$http', '$translate', 'notificationService', 'meetingService', '$modal', 'meeting', 'attachmentService']; 

    function ViewMeetingCtrl($scope, $state, $http, $translate, notificationService, meetingService, $modal, meeting, attachmentService) { 
     $scope.meeting = meeting; 

     $scope.cancelMeeting = cancelMeeting; 

     function cancelMeeting(meetingId, companyId) { 
      meetingService.sendCancelNotices(companyId, meetingId) 
       .success(function() { 
        $state.go('company.view'); 
       }); 
     }  
    } 
})(); 

sono stato in grado di richiamare l'succussfully spyOn per cancelMeeting() ma non con la chiamata di sendCancelNotices metodo. Quello che voglio fare è che voglio testarlo ogni volta che cancelMeeting() viene chiamato, chiama il metodo sendCancelNotices(). So che dovrei andare con il metodo createSpy per farlo. Ma non sono sicuro di come farlo.

Di seguito si riporta il caso di test ViewMeetingCtrlSpec.js

describe('ViewMeetingCtrl CreateSpy --> Spying --> cancelMeeting', function() { 
     var $rootScope, scope, $controller , $q ; 


     var sendCancelNoticesSpy = jasmine.createSpy('sendCancelNoticesSpy'); 


     beforeEach(angular.mock.module('MyApp')); 

     beforeEach(inject(function ($rootScope, $controller) { 
      scope = $rootScope.$new(); 
      createController = function() { 
       return $controller('ViewMeetingCtrl', { 
       $scope: scope, 
       meeting : {} 
       }); 
      }; 
      var controller = new createController(); 
     })); 

     it("tracks that the cancelMeeting spy was called", function() { 
      //some assertion 
     }); 

}); 
+2

effettivamente solo bisogno di utilizzare il metodo spyOn come spyOn (servizio, 'metodo') http: //jasmine.github .io/2.0/introduction.html che invocherà il metodo originale dopo aver eseguito le operazioni relative alla spia –

risposta

23
describe('ViewMeetingCtrl', function() { 

    var scope, meetingService; 

    beforeEach(angular.mock.module('MyApp')); 

    beforeEach(inject(function ($rootScope, $controller, _meetingService_) { 
     scope = $rootScope.$new(); 
     meetingService = _meetingService_; 
     $controller('ViewMeetingCtrl', { 
      $scope: scope, 
      meeting : {} 
     }); 
    })); 

    it('should send cancel notices whan cancelMeeting is called', function() { 
     var fakeHttpPromise = { 
      success: function() {} 
     }; 
     spyOn(meetingService, 'sendCancelNotices').andReturn(fakeHttpPromise); 

     scope.cancelMeeting('foo', 'bar'); 

     expect(meetingService.sendCancelNotices).toHaveBeenCalledWith('bar', 'foo'); 
    }); 

}); 

io vi incoraggio a smettere di fare affidamento su promesse HTTP essere restituiti dai servizi. Invece, considera solo che il servizio restituisce una promessa. Questi sono più facili da deridere e non ti costringono a riscrivere il codice del tuo controller quando non restituisci più le promesse HTTP.

nel controller:

function cancelMeeting(meetingId, companyId) { 
     meetingService.sendCancelNotices(companyId, meetingId) 
      .then(function() { 
       $state.go('company.view'); 
      }); 
    } 

nel test:

 var fakePromise = $q.when(); 
     spyOn(meetingService, 'sendCancelNotices')and.returnValue(fakePromise); 

     scope.cancelMeeting('foo', 'bar'); 
     expect(meetingService.sendCancelNotices).toHaveBeenCalledWith('bar', 'foo'); 
+1

grazie per la risposta. esattamente quello che volevo. tuttavia c'era bisogno di un piccolo cambiamento (and.returnValue()) visto che sto usando jasmine 2.0 – Malik

+0

Nel codice precedente chiamiamo spyOn (e possiamo chiamare createSpyObj per ottenere l'intero oggetto mocked) sull'istanza di servizio reale di MeetingService. Correggere? Nel nostro codice stiamo solo creando un oggetto spia su un oggetto String il cui valore della stringa è uguale al nome del servizio. Scriviamo qualcosa: beforeEach (function() {$ provide.factory ("meetingService", function() {meetingServiceMock = jasmine.createSpyObj ("meetingService", ['sendCancelNotices']); restituisci meetingServiceMock;}); quindi usa questo meetingServiceMock ovunque nei blocchi "it". Anche se funziona correttamente..non credo che abbia senso, vero? –

+0

Ha senso, ma è più lavoro, e hai sempre il rischio di creare un servizio di simulazione che non hanno gli stessi metodi del servizio attuale –

Problemi correlati