2013-10-15 8 views
13

पर मैं निर्देश से $ emit पर जासूसी करने की कोशिश कर रहा हूं, लेकिन किसी भी तरह से मैं $ emit 'सुन' को जासूसी नहीं कर सकता।

यह मेरा निर्देशों में कोड है 'नियंत्रक:

$scope.$on('send', function() { 
    console.log('called'); 
    $scope.$emit('resultSend', {'ok': true, 'data': ''}); 
}); 

यह मेरा इकाई परीक्षण है:

var $rootScope, $compile, elm, element; 

beforeEach(inject(function ($injector) { 
    $rootScope = $injector.get('$rootScope'); 
    $compile = $injector.get('$compile'); 
    elm = angular.element('<test></test>'); 
    element = $compile(elm)($rootScope); 
})); 


it('should listen for the send broadcast and emit the resultSend', function() { 
    spyOn($rootScope, '$emit'); 
    $rootScope.$broadcast('send'); 
    expect($rootScope.$emit).toHaveBeenCalledWith('resultSend'); 
}); 

console.log निर्गम (' कहा जाता है ') कर्मा द्वारा मुद्रित किया जाता है, तो मुझे लगता है कि यूनिट टेस्ट प्रसारण कार्यक्रम काम करता है।

क्या इसे $ emit के साथ प्रसारण करना नहीं है, लेकिन यदि ऐसा है, तो मैं इसे कैसे पकड़ूं, और यदि नहीं, तो मैं इस मामले को और कैसे संभाल सकता हूं?

+4

आप '$ रूटस्कोप 'पर जासूसी कर रहे हैं और' $ स्कोप 'पर' $ emit' को कॉल कर रहे हैं। –

उत्तर

13

दस्तावेज़ here के अनुसार, आप $emit और $broadcast के बीच के अंतर की अपनी समझ में सही हैं। हालांकि, मुझे लगता है कि समस्या $scope और $rootScope के उपयोग में है। आपके $rootScope आपके दायरे पदानुक्रम के शीर्ष स्तर पर होंगे। मैं अनुमान लगा रहा हूं (बस सभी कोड देखने में सक्षम होने के बिना अपने स्निपेट देखकर) कि आपके नियंत्रक में $scope एक नेस्टेड नियंत्रक है, जिसका अर्थ है कि आपके नियंत्रक में $scope ऐप के $rootScope का बच्चा है।

उस वजह से, जब आपका यूनिट परीक्षण $rootScope.$emit फ़ंक्शन पर जासूसी करता है, तो यह वास्तव में आपके नियंत्रक के $scope.$emit() कॉल पर जासूसी नहीं कर रहा है। वे दो "स्कोप" अलग हैं, वही बात नहीं। इसलिए, आपको $scope पर नकल करने की आवश्यकता है जिसे आप नियंत्रक के लिए प्रदान करते हैं और उसके बाद spyOn करें।

उदाहरण के लिए, अपने beforeEach में:

var ctrl, scope; 

beforeEach(function() { 
    module('<INSERT YOUR CONTROLLERS MODULE NAME HERE>'); 
    inject(function($rootScope, $controller) { 
     scope = $rootScope.$new(); 
     ctrl = $controller('<CTRL NAME HERE>', {$scope: scope}); 
    }); 
}); 

इस कोड को वास्तव में एक "नकली" गुंजाइश चर पैदा करेगा और अपने नियंत्रक, जिसे फिर आप जासूस और के साथ अन्य काम कर सकते हैं करने के लिए है कि वस्तु प्रदान करेगा। जैसे:

spyOn(scope, '$emit'); 
// do whatever triggers the "$emit" call 
expect(scope.$emit).toHaveBeenCalledWith('resultSend'); 

मुझे पूरा यकीन है कि आपकी समस्या को ठीक करना चाहिए। अगर मुझे और स्पष्टीकरण की आवश्यकता है तो मुझे बताएं।

+0

बहुत स्पष्ट, धन्यवाद! – Maarten

+0

इस मामले में नियंत्रक क्या है? – 9blue

+0

अरे जानकारी के लिए धन्यवाद, मैं Vue2 का परीक्षण करने के लिए जैस्मीन का उपयोग कर रहा हूं और मैंने वही किया है, एक घटक एक 'घटक' को उत्सर्जित करता है, इसलिए मैं जानना चाहता था कि उत्सर्जन का परीक्षण कैसे करें (शायद यह एक बेहतर तरीका है लेकिन यह ऐसा करता है) कॉन्स कंस्ट्रक्टर = Vue.extend (घटक); वीएम = नया कन्स्ट्रक्टर ({propsData})।$ माउंट(); spyOn (vm, '$ emit'); // जो कुछ भी "$ emit" कॉल ट्रिगर करता है (vm। $ Emit) .toHaveBeenCalledWith ('onComponentClose'); धन्यवाद! –

3

यदि आपके निर्देश में नियंत्रक है, तो आप निर्देश से अलग से परीक्षण कर सकते हैं और कर सकते हैं। यह एक एमवीसी आर्किटेक्चर का पूरा बिंदु है, आप वी से अलग से सी का परीक्षण कर सकते हैं;)

यह कहा गया, यह एक सादा-जेन नियंत्रक परीक्षण नमूना होगा।

एक और युक्ति: आपको अपने पहले सेट() या जासूस) (यानी जासूसों और जो कुछ भी) में अपने सभी सेट अप करना चाहिए और फिर अपने() ब्लॉक में दावे करना चाहिए।

अंत में: सुनिश्चित करें कि आप जिस जासूस को स्थापित कर रहे हैं, वह उस दायरे पर है जिसे आप जांच रहे हैं जिस नियंत्रक में आप जा रहे हैं।

+0

पॉइंटर्स के लिए धन्यवाद और भले ही आपका उत्तर भी सही था, मैं केवल एक को ध्वजांकित कर सकता हूं ;-) – Maarten

+1

यह वास्तव में "अंक" या जो कुछ भी नहीं है, जब तक लोगों को वह जानकारी प्राप्त न हो जो उन्हें जारी रखने की आवश्यकता हो। –

+0

सच है, फिर भी लगता है कि इसे पकड़ना मजेदार है ;-) – Maarten

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