2015-06-05 8 views
14

Mam następujący regulatorowi ViewMeetingCtrl.jsSzpieg na wywołanie metody usługi, korzystając Spies jaśminu

(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'); 
       }); 
     }  
    } 
})(); 

udało mi się succussfully wywołać spyOn dla cancelMeeting() ale nie z powołania Metoda sendCancelNotices. Co chcę zrobić, chcę przetestować, że kiedykolwiek zostanie wywołana cancelMeeting(), wywołuje metodę sendCancelNotices(). Wiem, że powinienem użyć metody createSpy, aby to zrobić. Ale nie jestem pewien, jak to zrobić.

Poniżej jest przypadek testowy 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

faktycznie wystarczy użyć metody spyOn jak spyOn (usługa, 'metoda') http: //jasmine.github .io/2.0/introduction.html , który wywoła oryginalną metodę po wykonaniu operacji związanych z szpiegiem –

Odpowiedz

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

}); 

Chciałbym zachęcić was do zatrzymania opierając obietnic HTTP zwracane z usług. Zamiast tego, po prostu uważają, że usługa zwraca obietnicę. Łatwiej im udawać i nie zmuszą cię do przepisania kodu kontrolera, gdy nie zwrócisz już obietnic HTTP.

W kontrolerze:

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

W testu:

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

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

dziękuję za odpowiedź. dokładnie to, co chciałem. jednak musiałem wykonać niewielką zmianę (and.returnValue()), ponieważ używam jaśminu 2.0 – Malik

+0

W powyższym kodzie wywołujemy spyOn (i możemy wywołać createSpyObj, aby uzyskać cały wyśmiewany obiekt) na prawdziwej instancji Service of MeetingService. Poprawnie? W naszym kodzie właśnie tworzymy obiekt szpiegowski na obiekcie String, w którym wartość ciągu jest taka sama jak nazwa usługi. Napiszemy coś: beforeEach (function() {$ provide.factory ("meetingService", function() {meetingServiceMock = jaśmin.createSpyObj ("meetingService", ['sendCancelNotices']); return meetingServiceMock;}), a następnie użyj tego meetingServiceMock wszędzie w "go" blokuje. Nawet jeśli działa poprawnie ... nie uważasz, że ma to sens? –

+0

To ma sens, ale to więcej pracy, i zawsze masz ryzyko stworzenia fałszywej usługi, która nie mają te same metody, co faktyczna usługa, –