Spy

2015-06-05 7 views
14

Aşağıdaki kontrolörünü var ViewMeetingCtrl.jsSpy

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

Ben succussfully cancelMeeting() için değil ait arama ile spyOn çağırmak başardı SendCancelNotices yöntemi. Ne yapmak istediğim, cancelMeeting() çağrıldığında, sendCancelNotices() yöntemini çağırdığını test etmek istiyorum. Bunu yapmak için createSpy yöntemiyle gitmem gerektiğini biliyorum. Ama nasıl yapacağımı bilmiyorum.

Aşağıda ben hizmetlerden döndürülen HTTP sözlerin güvenerek durdurmak için teşvik edecek test durumu

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

aslında sadece spyOn spyOn gibi yöntemi kullanmak gerekir (hizmet, 'yöntem') http: //jasmine.github .io/2.0/inst.html , casusluk ile ilgili işlemleri gerçekleştirdikten sonra orijinal yöntemi invoque –

cevap

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

}); 

ViewMeetingCtrlSpec.js olduğunu. Bunun yerine, sadece servisin bir söz verdiğini düşünün. Alay etmek daha kolay ve artık HTTP sözünü iade etmediğinizde, denetleyici kodunuzu yeniden yazmanızı zorlamayacaktır. senin testte

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

: Kumandanızda olarak

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

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

cevabınız için teşekkür ederiz. Tam olarak istediğim şeyi. Ancak, jasmine 2.0 – Malik

+0

kullanıyorum, çünkü yukarıdaki kodda SpyOn'u çağırıyoruz (ve tüm alay konusu nesneyi almak için createSpyObj'i arayabiliriz), MeetingService'nin gerçek hizmet örneğinde küçük bir değişiklik yapılması gerekiyordu (ve .returnValue()). Doğru mu? Kodumuzda, String'in değerinin hizmetin adı ile aynı olduğu bir String nesnesinde casus nesnesi oluşturuyoruz. Birşeyler yazıyoruz: beforeEach (function() {$ sağlayıcısı. ("MeetingService", function() {meetingServiceMock = jasmine.createSpyObj ("meetingService", ['sendCancelNotices']); return meetingServiceMock;}) ve sonra bunu kullanın meetingServiceMock her yerde "it" bloklar.O düzgün çalışıyor olsa bile ... mantıklı olduğunu düşünmüyor musunuz? –

+0

Bu mantıklı, ama daha fazla iş var, ve her zaman bir alay hizmeti oluşturma riski her zaman vardır Gerçek hizmetle aynı yöntemleri kullanın. –

İlgili konular