2015-02-25 6 views
8

मैं अपने नियंत्रक बनाने के लिए "नियंत्रक के रूप में" वाक्यविन्यास का उपयोग कर रहा हूं। मेरे पास एक निजी प्रारंभिक फ़ंक्शन है जो डिफ़ॉल्ट डेटा लोड करने के लिए फ़ंक्शन को कॉल करता है।मैं जैस्मीन का उपयोग कर नियंत्रक विधि पर जासूसी कैसे करूं?

var app = angular.module('plunker', []); 

app.controller('MainCtrl', function($scope) { 
    var mc = this; 
    mc.dataLoaded = false; 

    function init() { 
    mc.loadData(); 
    } 

    mc.loadData = function(){ 
    mc.dataLoaded = true; 
    } 

    init(); 
}); 

अपने परीक्षण में मैं जाँच करने के लिए है कि क्या loadData समारोह बुलाया गया है एक जासूस बना रहा हूं। हालांकि मैं सत्यापित कर सकता हूं कि फ़ंक्शन को mc.dataLoaded ध्वज के परीक्षण के द्वारा बुलाया गया है, लेकिन मेरा जासूस फ़ंक्शन को रिकॉर्ड करने के लिए प्रतीत नहीं होता है। फ़ंक्शन कॉल को सही तरीके से रिकॉर्ड करने के लिए मैं जासूसी कैसे प्राप्त कर सकता हूं?

describe('Testing a Hello World controller', function() { 
    var $scope = null; 
    var ctrl = null; 

    //you need to indicate your module in a test 
    beforeEach(module('plunker')); 

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

    ctrl = $controller('MainCtrl as mc', { 
     $scope: $scope 
    }); 

    spyOn($scope.mc, 'loadData').and.callThrough(); 
    })); 

    it('should call load data', function() { 
    expect($scope.mc.loadData).toHaveBeenCalled(); 
    //expect($scope.mc.dataLoaded).toEqual(false); 
    }); 
}); 

Plunker link

उत्तर

9

लाइनों का यह क्रम:

ctrl = $controller('MainCtrl as mc', { 
    $scope: $scope 
}); 

spyOn($scope.mc, 'loadData').and.callThrough(); 

मतलब है कि जैस्मीन जासूस के बाद नियंत्रक पहले से ही $ नियंत्रक द्वारा instantiated कर दिया गया है बनाया जाता है। जासूस बनने से पहले, init फ़ंक्शन पहले ही निष्पादित हो चुका है।

आप या तो चारों ओर लाइनों को स्विच नहीं कर सकते हैं, क्योंकि इससे पहले कि आप किसी विधि पर जासूसी कर सकें, MainCtrl को मौजूद होना चाहिए।

यदि init फ़ंक्शन किसी अन्य सेवा को कॉल करता है, तो उस सेवा की विधि पर जासूसी करें और जोर दें कि सेवा को सही तरीके से कहा जाता है। यदि MainCtrl कुछ आंतरिक रूप से कुछ कर रहा है, तो उसके परिणाम का परीक्षण करें, उदाहरण के लिए, उस नियंत्रक के डेटा/गुणों को अद्यतन कर रहे हैं। यदि यह काफी छोटा हो तो यह परीक्षण के लायक भी नहीं हो सकता है।

इसके अलावा

, जब से तुम वाक्य रचना के रूप में नियंत्रक का उपयोग कर रहे हैं, तो आप $ नियंत्रक बुला के बजाय सीधे गुंजाइश पहुँचने का वापसी मान के माध्यम से नियंत्रक देख सकते हैं:

ctrl = $controller('MainCtrl as mc', { 
    $scope: $scope 
}); 

ctrl.loadData === $scope.mc.loadData; // true 
+2

प्रश्न शायद दायरे से बाहर हो सकता है ... एक ऐसे कार्य पर जासूसी करना संभव हो सकता है जो $ स्कोप में नहीं है? मेरा मतलब है, उस कोड में 'init' जासूसी। –

+1

"यदि मेनकॉर्टर सिर्फ आंतरिक रूप से कुछ कर रहा है, तो उसके परिणाम का परीक्षण करें, उदाहरण के लिए, उस नियंत्रक के डेटा/गुणों को अद्यतन कर रहे हैं। यह परीक्षण के लायक भी नहीं हो सकता है यदि यह काफी छोटा हो।" यह बोल्ड होना चाहिए !!! –

+0

और आंतरिक नियंत्रक प्रारंभिक कोड किसी अन्य सेवा पर भरोसा नहीं करता है, परीक्षण की आवश्यकता के लिए पर्याप्त जटिल है, और इसका दायरा गुणों पर कोई दुष्प्रभाव नहीं है? प्रारंभिकरण कोड को किसी अन्य सेवा में स्थानांतरित करने का आपका एकमात्र विकल्प है? यूनिट परीक्षणों को सक्षम करने के लिए बस अपना कोड अधिक जटिल बनाने के लिए शर्म की तरह लग रहा है। – d512

1

मैं एक समाधान है कि अनुमति पाया मुझे अपने नियंत्रक को बदलने से बचने के लिए। मैं टेस्ट स्वीट के beforeEach विधि में एक $state नकली सेवा शामिल, और यह एक reload नकली विधि दिया:

beforeEach(inject(function ($controller, $rootScope) { 
    stateMock = { 
     reload: function() { 
      myCtrl = $controller('MyCtrl'); 
     } 
    }; 
    ... 

फिर चमेली परीक्षण के भीतर, मैं बस stateMock.reload() कॉल कर सकते हैं मेरी नियंत्रक को पुन: प्रारंभ करने में जबकि मेरी जासूस मैं संरक्षण एक और beforeEach ब्लॉक में घोषित किया गया।

+0

क्या वह वास्तव में काम करता है? आप एक नया नियंत्रक ऑब्जेक्ट बना रहे हैं, तो क्या आपके द्वारा पहले घोषित जासूसों को पुराने नियंत्रक ऑब्जेक्ट से बाहर नहीं किया जाएगा? – d512

+0

मेरी टीम के लिए काम किया। अप्रत्याशित मूल्यों पर असफल होने के लिए अस्थायी रूप से जैस्मीन परीक्षणों को बदलकर सत्यापित किया गया। क्या यह आपके लिए त्रुटियों को फेंक दिया? – dpfrakes

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