2015-07-03 8 views
6

कहा गया है मेरे पास AngularJS नियंत्रक में परिभाषित एक विधि है जिसे प्रारंभ करने पर कहा जाता है। मैं जैस्मीन ("jasmine-core": "^2.3.4", "karma": "^0.12.37") का उपयोग करके इसका परीक्षण करना चाहता हूं। मैं इंटरनेट और स्टैक ओवरफ्लो प्रश्नों पर कुछ ट्यूटोरियल्स का पालन करता हूं, लेकिन मुझे सही जवाब नहीं मिल रहा है।जैस्मीन नियंत्रक परीक्षण, अपेक्षित जासूस को

नियंत्रक usersAddUserController:

(function() { 
    'use strict'; 

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

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

     }]); 
}()); 

जैस्मीन परीक्षण: कृपया इस कोड पर एक नज़र डालें

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

    }); 
}()); 

परीक्षण चल रहा है, त्रुटि संदेश है के बाद:

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

Expected spy getCountryPhoneCodes to have been called. 

मैं जाहिर है कुछ याद आ रही है, लेकिन मैं यह नहीं समझ सकता कि यह क्या है। किसी भी तरह की सहायता को आभार समझेंगे।

उत्तर

3

आप पर जासूसी कर रहे हैं इसके बाद नकली तत्काल नियंत्रक में पारित किया गया है। मेरी समाधान

+0

उत्तर के लिए धन्यवाद, लेकिन दुर्भाग्यवश अभी भी आपके कोड के साथ एक ही त्रुटि हो रही है। क्या यह आपके लिए काम कर रहा है? –

+0

मैंने वास्तव में इसे आजमाया नहीं था, यह सिर्फ स्पष्ट मुद्दे की तरह दिखता था। क्या आप अपने कंट्रोलर कन्स्ट्रक्टर पर ब्रेकपॉइंट डाल सकते हैं और देख सकते हैं कि वास्तव में यह जासूस है जिसे कॉल कर रहा है? – Martin

+0

बहुत बहुत धन्यवाद दोस्तों! वास्तव में @juunas सही था, मुझे अब सफलता मिली है। अगर जुनास सहमत हैं, तो मैं मार्टिन के जवाब को वैसे भी स्वीकार करूंगा, इससे मुझे बहुत मदद मिलती है :) –

1

आप इस तरह नकली प्रदान कर सकते हैं:

mockedAddUserService = { 
    getCountryPhoneCodes: emptyPromise 
}; 


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

संपादित करें:

कोड (मैं यह परीक्षण नहीं कर सकते के रूप में) देखना चाहिए इस तरह:

(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

आप जवाब के लिए धन्यवाद में बग देख के लिए

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

संपादित धन्यवाद @juunas, लेकिन आप पूरा कोड प्रदान कर सकता है:

इस प्रयास करें? जब मैं अपने कोड में अपना समाधान शामिल करता हूं तो मुझे यह मिलता है: "TypeError: 'अपरिभाषित' एक ऑब्जेक्ट नहीं है ('deferred.resolve' का मूल्यांकन)"। –

+0

कोड के लिए धन्यवाद, मैं आपके समाधान का भी प्रयास करूंगा और प्रतिक्रिया दे सकता हूं कि और क्या करने की आवश्यकता है। –

संबंधित मुद्दे