2015-07-03 23 views
6

olarak adlandırılması AngularJS denetleyicisinde, başlatma sırasında çağrılan bir yöntem var. Jasmine ("jasmine-core": "^2.3.4", "karma": "^0.12.37") kullanarak test etmek istiyorum. İnternet ve StackOverflow ile ilgili bazı soruları takip ediyorum ama doğru cevabı bulamıyorum. testler, hata mesajı sonraYasemin denetleyici testi, beklenen casusun

(function() { 

    'use strict'; 

    describe('usersAddUserControllerUnitTest', function() { 
     var scope, deferred, objectUnderTest, mockedAddUserService; 

     beforeEach(module('app')); 

     beforeEach(inject(function ($rootScope, $q, $controller) { 
      scope = $rootScope.$new(); 

      function emptyPromise() { 
       deferred = $q.defer(); 
       return deferred.promise; 
      } 

      mockedAddUserService = { 
       getCountryPhoneCodes: emptyPromise 
      }; 

      objectUnderTest = $controller('usersAddUserController', { 
       $scope: scope, 
       usersAddUserService: mockedAddUserService 
      }); 
     })); 

     it('should call getCountryPhoneCodes method on init', function() { 
      //when    
      spyOn(mockedAddUserService, 'getCountryPhoneCodes').and.callThrough(); 

      deferred.resolve(); 

      scope.$root.$digest(); 

      //then 
      expect(mockedAddUserService.getCountryPhoneCodes).toHaveBeenCalled(); 
     }); 

    }); 
}()); 

:

Kontrolör usersAddUserController:

(function() { 
    'use strict'; 

    angular.module('app.users.addUser') 
     .controller('usersAddUserController', ['$scope', 'usersAddUserService', function ($scope, usersAddUserService) { 

      usersAddUserService.getCountryPhoneCodes().then(function (phoneCodes) { 
       $scope.phoneCodes = phoneCodes; 
      }); 

     }]); 
}()); 

Yasemin testi bu kodu bir göz atın lütfen

PhantomJS 1.9.8 (Windows 7 0.0.0) usersAddUserControllerUnitTest should call getCountryPhoneCodes method on init FAILED

Expected spy getCountryPhoneCodes to have been called. 

I Belli ki bir şey eksik, ama ne olduğunu anlayamıyorum. Herhangi bir yardım takdir edilecektir.

Böyle alay sağlayabilir

cevap

3

Sahte, anlık denetleyiciye aktarıldıktan sonra. Benim çözüm

+0

Cevabınız için teşekkür ederiz, ancak maalesef hala kodunuzla aynı hatayı alıyor. Senin için çalışıyor mu? –

+0

Aslında denemedim, sadece bariz bir soruna benziyordu. Denetleyici kurucunuza bir kesme noktası koyabilir ve aslında aradığı casus olup olmadığını görebilir misiniz? – Martin

+0

Çok teşekkür ederim beyler! Gerçekten de @juunas haklıydı, şimdi BAŞARIZI aldım. Eğer juunas katılıyorum, yine de Martin cevap kabul edeceğim, bu bana çok yardımcı olur :) –

1

:

mockedAddUserService = { 
    getCountryPhoneCodes: emptyPromise 
}; 


beforeEach(function() { 
    module(function ($provide) { 
     $provide.value('usersAddUserService', mockedAddUserService); 
    }); 
}); 

DÜZENLEME:

kodu şöyle: (i test edemez gibi) görünmelidir: Sen gözetliyorsun

(function() { 
    'use strict'; 

    describe('usersAddUserControllerUnitTest', function() {   
     beforeEach(module('app')); 

     var emptyPromise = function() { 
      var deferred = $q.defer(); 
      return deferred.promise; 
     } 

     var mockedAddUserService = { 
      getCountryPhoneCodes: emptyPromise 
     }; 

     beforeEach(function() { 
      module(function ($provide) { 
       $provide.value('usersAddUserService', mockedAddUserService); 
      }); 
     }); 

     var scope; 
     beforeEach(inject(function ($rootScope, $q, $controller) { 
      scope = $rootScope.$new(); 
      $controller('usersAddUserController', { 
       $scope: scope 
      }); 
     })); 

     it('should call getCountryPhoneCodes method on init', function() { 
      spyOn(mockedAddUserService, 'getCountryPhoneCodes').and.callThrough(); 

      scope.$root.$digest(); 

      expect(mockedAddUserService.getCountryPhoneCodes).toHaveBeenCalled(); 
     }); 

    }); 
}()); 
+0

Cevabınız için teşekkür ederim hatasından fark için

describe('usersAddUserControllerUnitTest', function() { var scope, deferred, objectUnderTest, mockedAddUserService, $controller; beforeEach(module('app')); beforeEach(inject(function ($rootScope, $q, _$controller_) { scope = $rootScope.$new(); function emptyPromise() { deferred = $q.defer(); return deferred.promise; } mockedAddUserService = { getCountryPhoneCodes: emptyPromise }; $controller = _$controller_; })); function makeController() { objectUnderTest = $controller('usersAddUserController', { $scope: scope, usersAddUserService: mockedAddUserService }); } it('should call getCountryPhoneCodes method on init', function() { //when spyOn(mockedAddUserService, 'getCountryPhoneCodes').and.callThrough(); makeController(); deferred.resolve(); scope.$root.$digest(); //then expect(mockedAddUserService.getCountryPhoneCodes).toHaveBeenCalled(); }); }); 

DÜZENLEME Teşekkür @juunas ama bütün kod sağlayabilir:

bu deneyin? Çözümünüzü koduma eklediğimde şunu elde ederim: "TypeError: 'undefined' bir nesne değildir ('deferred.resolve' değerini değerlendirmek)". –

+0

Kod için teşekkürler, çözümünüzü de denedim ve daha fazla yapılması gerekenler konusunda geribildirimde bulunacağım. –