7

मैं निम्नलिखित नियंत्रक EditMeetingCtrl.js

(function() { 
    'use strict'; 

    angular 
     .module('myApp') 
     .controller('EditMeetingCtrl', EditMeetingCtrl); 

    EditMeetingCtrl.$inject = ['$rootScope', '$scope', '$state', '$http', '$translate', 
     'meetingService', 'companyService', 'notificationService', 'meeting']; 

function EditMeetingCtrl($rootScope, $scope, $state, $http, $translate, meetingService, companyService, notificationService, meeting) { 
     $scope.meeting = meeting; 

     $scope.companyId = $state.params.companyId; 
     $scope.save = save; 


     function save() { 
      $scope.buttonDisable = true; 
      meetingService.saveMeeting($state.params.companyId, $state.params.meetingId, $scope.meeting) 
       .success(function(meetingId) { 
        //more code 
       }); 
     } 


} 
})(); 

EditMeetingCtrlSpec.js परीक्षण का मामला

describe('in EditMeetingCtrl', function() { 

    var companyService , meetingService ; 

    meetingId = 123321 ;      
    companyId = 456654 ; 
    meetingObj = {} ; 

    var fakeHttpPromise = { 
          success: function() {} 
          }; 

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

    beforeEach(angular.mock.inject(function (_$httpBackend_, _companyService_ , _meetingService_) { 
     $httpBackend = _$httpBackend_; 
     companyService = _companyService_; 
     meetingService = _meetingService_ ; 
    })); 

    describe('EditMeetingCtrl.save()', function() { 
     var $rootScope, scope, $controller , $q ; 

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

     it("should save the meeting object", function() { 
      spyOn(meetingService, 'saveMeeting').and.returnValue(fakeHttpPromise); 
      scope.save(); 
      expect(meetingService.saveMeeting).toHaveBeenCalledWith(meetingId , companyId , meetingObj); 
     }); 

    }); 

}); 

नीचे परीक्षण casse EditMeetingCtrlSpec को चलाने के लिए प्रयास करते हैं .js मुझे निम्नलिखित परीक्षण विफलता मिली

PhantomJS 1.9.8 (Windows 8) EditMeetingCtrl Spying --> EditMeetingCtrl.save() should save the meeting FAILED 
     Expected spy saveMeeting to have been called with [ 123321, 456654, Object({ }) ] but actual calls were [ undef 
ined, undefined, Object({ }) ]. 

तो मेरी समस्या को समझने का तरीका, save() विधि के लिए सेवा कॉल में $state.params.companyId, $state.params.meetingId पैरामीटर शामिल हैं और यह सेवा कॉल आने पर undefined मान भेजता है। इसलिए मुझे $state.params पर नकल करने की आवश्यकता है। सुनिश्चित नहीं है कि यह कैसे करें। क्या कोई मुझे सही दिशा में इंगित कर सकता है?

संपादित के बाद माइकल Radionov उत्तर

describe('EditMeetingCtrl.save()', function() { 
     var $rootScope, scope, $controller , $q , $state ; 

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

     it("should save the meeting", function() { 
      $state.params = { companyId: 123, meetingId: 567 }; 
      spyOn(meetingService, 'saveMeeting').and.returnValue(fakeHttpPromise); 
      scope.save(); 
      //expect(meetingService.saveMeeting).toHaveBeenCalledWith(meetingId , companyId , meetingObj); 
     }); 

    }); 

मैंने ऊपर किया है, लेकिन मैं कह $ राज्य परिभाषित नहीं है निम्नलिखित त्रुटि मिलती है।

Firefox 38.0.0 (Windows 8.1) In EditMeetingCtrl EditMeetingCtrl.save() should save the meeting FAILED 
     TypeError: $state is undefined in C:/Users/sal/Documents/myApp/test/meeting/EditMe 
etingCtrlSpec.js (line 80) 

मैं यह हुआ क्योंकि मैं ऐसा नहीं करते ग्रहण ->$state : state इंजेक्षन विधि में, तो मैं वह भी कर रही है की कोशिश की, लेकिन एक ही त्रुटि मिली। मुझे यहां क्या समझ नहीं आ रहा है ?

उत्तर

15

आप पूरे $state प्रदाता नकली कर सकते हैं और फिर save कॉल करने से पहले निर्दिष्ट वास्तव में क्या ये मान params संपत्ति में होना चाहते हैं:

describe('in EditMeetingCtrl', function() { 

    // ... 
    beforeEach(angular.mock.module('myApp')); 

    beforeEach(angular.mock.module(function ($provide) { 

     // mock the entire $state provider 
     $provide.provider('$state', function() { 
      return { 
       $get: function() { 
        return { 
         // by default it will be an empty object 
         params: {} 
        }; 
       } 
      }; 
     }); 

    })); 

    // .... 

    describe('EditMeetingCtrl.save()', function() { 

     // inject mocked $state - one that you've provided above 

     var $rootScope, scope, $controller, $q, state; 
     // ---------------------------------------^^^ 

     beforeEach(inject(function ($rootScope, $controller, $state, _meetingService) { 
      // ------------------------------------------------^^^ 
      state = $state; 
     })); 

     // ... 

     it("should save the meeting object", function() { 

      // provide custom params which will be used in a call 
      state.params = { companyId: 123, meetingId: 567 }; 

      spyOn(meetingService, 'saveMeeting').and.returnValue(fakeHttpPromise); 
      scope.save(); 
      expect(meetingService.saveMeeting).toHaveBeenCalledWith(meetingId , companyId , meetingObj); 
     }); 
    }); 

    // ... 

}); 
+0

आपके उत्तर के लिए धन्यवाद। कृपया मेरे प्रश्न में किए गए संपादन को देखें। ? क्या मैं गलत हूं ? – Malik

+1

मुझे लगता है कि यह गलत परिवर्तनीय नामों के कारण है। 'Var state; 'का उपयोग करें, फिर जब' राज्य = $ राज्य 'का उपयोग इंजेक्शन करते हैं, और' it' ब्लॉक में' state.params' का उपयोग करें। मैंने अपना जवाब अपडेट कर लिया है, संपादन लिंक देखें। –

+0

धन्यवाद !! । वह काम किया । और अब मुझे पता है कि मैं क्या गलत कर रहा था। :) – Malik

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