2011-12-12 15 views
5

क्या कक्षाओं के निजी तरीकों पर जैस्मीन इकाई परीक्षण ढांचे की spyon विधि का उपयोग करना संभव है?एक निजी विधि पर जैस्मीन spyon का उपयोग

प्रलेखन इस उदाहरण को देता है लेकिन क्या यह एक निजी समारोह के लिए flexivble हो सकता है?

describe("Person", function() { 
    it("calls the sayHello() function", function() { 
     var fakePerson = new Person(); 
     spyOn(fakePerson, "sayHello"); 
     fakePerson.helloSomeone("world"); 
     expect(fakePerson.sayHello).toHaveBeenCalled(); 
    }); 
}); 

अग्रिम

उत्तर

4

कोई कारण धन्यवाद आप अपने उदाहरण के संदर्भ से बाहर एक निजी समारोह का उपयोग नहीं कर सकते।

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

जासूस उपयोगी होते हैं जब आप Dependency Injection के साथ काम करते हैं, जहां सभी बाहरी निर्भरताएं कन्स्ट्रक्टर द्वारा पारित की जाती हैं और आपकी कक्षा में नहीं बनाई जाती हैं। तो मान लें कि आपके पास एक कक्षा है जिसके लिए एक डोम तत्व की आवश्यकता है। Normaly आप इस तत्व को पाने के लिए कक्षा में एक jquery चयनकर्ता का उपयोग करेंगे। लेकिन आप कैसे परीक्षण करना चाहते हैं कि उस तत्व के साथ कुछ किया जाता है? निश्चित रूप से आप इसे अपने परीक्षण पृष्ठों एचटीएमएल में जोड़ सकते हैं। लेकिन आप कन्स्ट्रक्टर में तत्व को गुजरने के लिए अपनी कक्षा को भी कॉल कर सकते हैं। ऐसा करने के बाद, आप यह जांचने के लिए जासूस का उपयोग कर सकते हैं कि आपकी कक्षा उस तत्व के साथ इंटरैक्ट करता है जैसा आपने अपेक्षित था।

+16

यह कहना सही नहीं है कि 'उन वस्तुओं पर जासूसी करना एक अच्छा विचार नहीं है जिन्हें आप परीक्षण करना चाहते हैं'। जासूसों का उपयोग यह जांचने के लिए सीमित नहीं है कि फ़ंक्शन को बस बुलाया गया था या नहीं। आप परीक्षण मूल्यों, त्रुटियों को फेंकने आदि के लिए पूरी तरह से कार्यों को प्रतिस्थापित करने के लिए, लौट मूल्यों की जांच के लिए जासूसों का उपयोग कर सकते हैं। मैं एक और पूर्ण समझ के लिए जैस्मीन दस्तावेज पढ़ने का सुझाव दूंगा। –

+1

यह जासूसी करने के लिए एक अच्छा विचार नहीं है !? आप और अधिक गलत नहीं हो सकता! हाँ मैं टिम के साथ सहमत हूं और आपको डॉको को देखना चाहिए, जिसने इसे वोट दिया ?! –

+0

जो मैंने कहा वह नहीं है। जासूसों का उपयोग करना ठीक है। लेकिन आपको उस ऑब्जेक्ट को संभालना चाहिए जिसे आप ब्लैक बॉक्स के रूप में जांचना चाहते हैं। केवल परीक्षण करें कि अंदर क्या और बाहर जाता है। ब्लैक बॉक्स के आंतरिक परीक्षण न करें, यदि आप परीक्षण के तहत ऑब्जेक्ट के तरीकों पर जासूसी करते हैं तो आप क्या करेंगे। तो आप ऑब्जेक्ट में गुजरने वाले कॉलबैक पर जासूसी पूरी तरह से ठीक है। –

0

यदि आप कक्षा के भीतर निजी कार्यों का परीक्षण करना चाहते हैं, तो क्यों न अपनी कक्षा में एक कन्स्ट्रक्टर जोड़ें जो सिग्नल करता है कि उन निजी कार्यों को वापस कर दिया जाता है?

को देखने के लिए मैं क्या मतलब है इस के माध्यम से पढ़ने है: http://iainjmitchell.com/blog/?p=255

मैं एक ऐसी ही विचार उपयोग किया गया है और अब तक इसकी महान काम!

+5

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

+0

हम सहमत हैं कि उस पर असहमत है। हमारा जावास्क्रिप्ट कोडबेस भारी है और हम केवल हमारे कुछ वर्गों पर सार्वजनिक कार्यों/गुणों के एक संभालते हैं। उन निजी कार्यों में बहुत से तर्क को संभाला जाता है। मैं केवल एक निजी विधि सार्वजनिक करता हूं ताकि परीक्षण ढांचे तक इसका उपयोग हो। अगर निर्माता को सही ढंग से नहीं कहा जाता है तो निजी फ़ंक्शन वापस नहीं किया जाता है। – StevenMcD

+1

इस विषय पर एक अच्छा एसओ है: http://stackoverflow.com/q/7075938/184883। –

3

यदि आप अपनी ऑब्जेक्ट्स के लिए टाइपस्क्रिप्ट का उपयोग करते हैं, तो फ़ंक्शन वास्तव में निजी नहीं है।
आपको केवल spyOn कॉल से लौटाए गए मान को सहेजने की आवश्यकता है और फिर calls संपत्ति से पूछें।

अंत में इस कोड को आप के लिए ठीक से काम करना चाहिए (कम से कम यह मेरे लिए काम किया):

describe("Person", function() { 
    it("calls the sayHello() function", function() { 
     var fakePerson = new Person(); 
     // save the return value: 
     var spiedFunction = spyOn(fakePerson, "sayHello"); 
     fakePerson.helloSomeone("world"); 
     // query the calls property: 
     expect(spiedFunction.calls.any()).toBeFalsy(); 
    }); 
}); 
+4

यदि मैं एक गैर-निर्यातित (निजी) फ़ंक्शन को कॉल करने का प्रयास करता हूं तो मुझे एक प्रकार की त्रुटि मिलती है: 'त्रुटि: (33, 56) टीएस 2345: प्रकार का तर्क' "हेल्लो" 'प्रकार के पैरामीटर के लिए असाइन करने योग्य नहीं है' 'गॉडबी' ' 'जहां' कहें 'गुडबाय' व्यक्ति 'पर एक सार्वजनिक विधि है और' गुडबाय 'निजी है। मुझे इसे किसी भी ("SayHello" के रूप में किसी भी रूप में डालना है) – FlavorScape

+0

मुझे यहां अधिक संदर्भ की आवश्यकता है, ऐसा लगता है कि आपका असाइनमेंट काम नहीं कर रहा है और निजी फ़ंक्शन तक पहुंच नहीं है। लेकिन इसे इस तरह से एक्सेस करने का प्रयास करें: 'person.sayHello' के बजाय' व्यक्ति ["sayHello"] '(यदि आप यही कर रहे हैं)। यह सबसे अच्छा अभ्यास नहीं है, लेकिन दुर्लभ मामलों में माफ कर दिया गया है;) – jurl

1

बस एक सामान्य पैरामीटर spyon() कार्य करने के लिए < किसी भी> जोड़ें:

spyOn<any>(fakePerson, 'sayHello'); 

यह पूरी तरह से काम करता है!

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