6

सबसे पहले करने के लिए पारित किया है, मैं इकाई परीक्षण करने के लिए नियंत्रक है कि एक Angular Material Dialog उदाहरण के लिए भेजी जा रही है कोशिश कर रहा हूँ।परीक्षण नियंत्रक एक कोणीय सामग्री संवाद उदाहरण

एक सामान्य प्रश्न है, यह अलग से इस तरह के एक नियंत्रक परीक्षण करने के लिए और अधिक समझ में, या वास्तव में $mdDialog.show() लागू द्वारा करता है?

मैं पहली विधि का प्रयास कर रहा हूँ, लेकिन मैं कुछ मुद्दों पर, ज्यादातर कैसे कोणीय सामग्री बांधता नियंत्रक करने के लिए "स्थानीय लोगों" से संबंधित में चल रहा हूँ।

यहाँ कोड है कि मैं अपने स्रोत कोड है, जो उम्मीद के रूप में काम करता है में संवाद आह्वान करने के लिए उपयोग कर रहा हूँ है:

$mdDialog.show({ 
    controller: 'DeviceDetailController', 
    controllerAs: 'vm', 
    locals: {deviceId: "123"}, 
    bindToController: true, 
    templateUrl: 'admin/views/deviceDetail.html', 
    parent: angular.element(document.body), 
    targetEvent: event 
}); 

मैं नहीं मानता docs अपडेट किए गए हैं, लेकिन संस्करण 0.9 के रूप में। 0 या तो, जब कन्स्ट्रक्टर फ़ंक्शन कहा जाता है, स्थानीय लोग नियंत्रक के लिए उपलब्ध होते हैं (this issue on Github देखें)। यहाँ परीक्षण के अंतर्गत नियंत्रक निर्माता समारोह का एक छीन नीचे संस्करण है, तो आप देख सकते हैं कि मैं क्यों चर में पारित होने के लिए और उपलब्ध जब नियंत्रक "instantiated" है की जरूरत है:

function DeviceDetailController(devicesService) { 
    var vm = this; 

    vm.device = {}; 
// vm.deviceId = null;   //this field is injected when the dialog is created, if there is one. For some reason I can't pre-assign it to null. 

    activate(); 

    ////////// 
    function activate() { 
     if (vm.deviceId != null) { 
      loadDevice(); 
     } 
    } 

    function loadDevice() { 
     devicesService.getDeviceById(vm.deviceId) 
      .then(function(data) { 
       vm.device = data.collection; 
      }; 
    } 
} 

मैं परीक्षण करने के लिए कोशिश कर रहा हूँ डिवाइस को vm.device को असाइन किया जाता है जब कोई डिवाइस ID को कन्स्ट्रक्टर फ़ंक्शन में आने से पहले पास किया जाता है।

परीक्षण (चमेली और सिनोन, कर्म द्वारा संचालित):

describe('DeviceDetailController', function() { 
    var $controllerConstructor, scope, mockDevicesService; 

    beforeEach(module("admin")); 

    beforeEach(inject(function ($controller, $rootScope) { 
     mockDevicesService = sinon.stub({ 
      getDeviceById: function() {} 
     }); 
     $controllerConstructor = $controller; 
     scope = $rootScope.$new(); 
    })); 

    it('should get a device from devicesService if passed a deviceId', function() { 
     var mockDeviceId = 3; 
     var mockDevice = {onlyIWouldHaveThis: true}; 
     var mockDeviceResponse = {collection: [mockDevice]}; 
     var mockDevicePromise = { 
      then: function (cb) { 
       cb(mockDeviceResponse); 
      } 
     }; 

     var mockLocals = {deviceId: mockDeviceId, $scope: scope}; 

     mockDevicesService.getDeviceById.returns(mockDevicePromise); 

     var ctrlConstructor = $controllerConstructor('DeviceDetailController as vm', mockLocals, true); 
     angular.extend(ctrlConstructor.instance, mockLocals); 
     ctrlConstructor(); 

     expect(scope.vm.deviceId).toBe(mockDeviceId); 
     expect(scope.vm.device).toEqual(mockDevice); 
    }); 
}); 

जब मैं इस चलाने के लिए, पहले जोर से गुजरता है और दूसरा एक विफल रहता है ("अपेक्षित वस्तु ({}) बराबर वस्तु को ({ केवल IWouldHaveThis: true})। "), जो मुझे दिखाता है कि डिवाइस आईडी को नियंत्रक के दायरे में इंजेक्शन दिया जा रहा है, लेकिन जाहिर है कि इसे सक्रिय करने के लिए सक्रिय() विधि में अगर खंड के लिए समय में नहीं है।

आपको लगता है कि मैं, के रूप में करने का विरोध किया, जिसके परिणामस्वरूप बुनियादी प्रक्रिया है कि Angular Material तीसरा तर्क है, जो $controller() का कारण बनता है नियंत्रक निर्माता समारोह वापस जाने के लिए 'सही' करने के लिए सेट के साथ $ नियंत्रक बुला() द्वारा उपयोग करता नकल करने के लिए कोशिश कर रहा हूँ देखेंगे नियंत्रक। इसके बाद मुझे अपने स्थानीय चर के साथ कन्स्ट्रक्टर का विस्तार करने में सक्षम होना चाहिए (जैसे कि कोणीय सामग्री उपरोक्त से जुड़े कोड में होती है), और उसके बाद नियंत्रक को तत्काल करने के लिए कन्स्ट्रक्टर फ़ंक्शन का आह्वान करें।

मैं $rootScope.$new(true) बुला, कोई प्रभाव नहीं करने से नियंत्रक करने के लिए एक अलग गुंजाइश उत्तीर्ण करना शामिल बातें, के एक नंबर की कोशिश की है (मैं वास्तव में नहीं कह सकता मैं पूरी तरह से गुंजाइश को अलग समझते हैं, लेकिन $ mdDialog डिफ़ॉल्ट रूप से यह उपयोग करता है)।

किसी भी मदद की सराहना की जाती है!

उत्तर

0

पहली बात मैं कोशिश करेगा $ नियंत्रक करने के लिए अपने कॉल से 'के रूप में वी एम' कम करने के लिए किया जाएगा। आप परीक्षण की अपेक्षा के बजाय अपनी अपेक्षा के लिए वापसी मूल्य का उपयोग कर सकते हैं।

इस प्रयास करें:

var ctrlConstructor = $controllerConstructor('DeviceDetailController', mockLocals, true); 
    angular.extend(ctrlConstructor.instance, mockLocals); 
    var vm = ctrlConstructor(); 

    expect(vm.deviceId).toBe(mockDeviceId); 
    expect(vm.device).toEqual(mockDevice); 
संबंधित मुद्दे