2011-12-20 9 views
7

मेरे पास एक जावास्क्रिप्ट स्वत: पूर्ण प्लगइन है जो निम्न वर्गों (कॉफ़ीस्क्रिप्ट में लिखी गई) का उपयोग करता है: क्वेरी, सुझाव, सुझाव चयन, और स्वत: पूर्ण। इन वर्गों में से प्रत्येक में जैस्मीन में लिखा गया एक विशिष्ट नमूना है।ग्लोबल नेमस्पेस प्रदूषित किए बिना यूनिट परीक्षण के लिए जावास्क्रिप्ट ऑब्जेक्ट्स का खुलासा कैसे करें

प्लगइन, एक मॉड्यूल के भीतर परिभाषित किया गया है जैसे: की तरह कुछ के साथ

(function(){ 
    // plugin... 
}).call(this); 

यह ग्लोबल नेमस्पेस को दूषित से कक्षाओं से बचाता है, लेकिन यह भी उन्हें किसी भी परीक्षण से छुपाता है (चमेली के साथ चश्मा, या इकाई-परीक्षण q-इकाई)।

ग्लोबल नेमस्पेस प्रदूषित किए बिना परीक्षण के लिए जावास्क्रिप्ट कक्षाओं या ऑब्जेक्ट्स का पर्दाफाश करने का सबसे अच्छा तरीका क्या है?

मैं जिस समाधान के साथ आया था उसका जवाब दूंगा, लेकिन मुझे आशा है कि कुछ और मानक होगा।

अपडेट: मेरे प्रयास किया गया समाधान

क्योंकि मैं < 100 XP के साथ एक newb हूँ, मैं 8 घंटे के लिए अपने ही सवाल का जवाब नहीं कर सकते हैं। प्रतीक्षा करने के बजाय मैं जो कुछ भी यहां करता हूं उसे जोड़ दूंगा।

इन कक्षाओं को spec करने के लिए, मैंने _test नामक एक वैश्विक वस्तु का आविष्कार किया जिसे मैंने परीक्षण के लिए सभी कक्षाओं का खुलासा किया। उदाहरण के लिए, coffeescript में:

class Query 
    // ... 

class Suggestion 
    // ... 

// Use the classes 

// Expose the classes for testing 
window._test = { 
    Query: Query 
    Suggestion: Suggestion 
} 

मेरी ऐनक के अंदर है, तो, मैं कक्षा प्रकट कर सकते हैं मैं परीक्षण कर रहा हूँ:

Query = window._test.Query 

describe 'Query', -> 
    // ... 

यह लाभ यह है कि केवल _test वस्तु प्रदूषित है है, और यह यह संभावना नहीं है कि यह इस वस्तु की एक और परिभाषा के साथ टकरा जाएगा। यह अभी भी उतना साफ नहीं है जितना मैं इसे पसंद करूंगा। मुझे उम्मीद है कि कोई बेहतर समाधान प्रदान करेगा।

+0

हो सकता है कि कुछ आंतरिक चर का पर्दाफाश, केवल? उदाहरण: 'window.exposedVars = this' (बंद करने का आंतरिक)? –

+0

मैंने इसे पोस्ट करने के कुछ ही सेकंड बाद अपने प्रस्तावित समाधान को जोड़ा। क्या आप सुझाव दे रहे थे कि आप क्या सुझाव दे रहे थे? – Mitch

+0

आपकी प्लगइन कैसे उपयोगी है और अभी भी वैश्विक नामस्थान में कुछ भी नहीं जोड़ रहा है? मैं वास्तव में उत्सुक हूं, शायद आप ऐसा कुछ कर रहे हैं जिसके बारे में मुझे पता नहीं है। जहां तक ​​मैं कह सकता हूं, वहां हमेशा कम से कम एक वस्तु होनी चाहिए जो वैश्विक नामस्थान में हो। –

उत्तर

3

मुझे लगता है कि कॉमनजेएस मॉड्यूल सिस्टम की तरह कुछ (उदाहरण के लिए brunch द्वारा उपयोग किया जाता है) काम करेगा।

आप अपने कोड को मॉड्यूल में अलग कर सकते हैं, और जिन हिस्सों की आवश्यकता है उन्हें require के माध्यम से आयात किया जाएगा। "प्रदूषित" हो जाने वाला एकमात्र हिस्सा मॉड्यूल प्रबंधन कोड द्वारा बनाए गए मॉड्यूल मानचित्र है, जो आपके test ऑब्जेक्ट के समान ही है।

Autocomplete.coffee

class exports.Query 
// ... 

class exports.Suggestion 
// ... 

में और उसके बाद Autocomplete.spec.coffee में

{Query, Suggestion} = require 'app/models/Autocomplete' 

describe 'Query', -> 
+0

दिलचस्प। मैंने पहले इस प्रणाली में नहीं देखा था। मुझे लगता है कि यह मैंने जो किया उसके सार में काफी समान है। एक हल्के वजन वाली प्लगइन के लिए आप दूसरों के साथ साझा करना चाहते हैं, मुझे यकीन नहीं है कि मैं एक संपूर्ण मॉड्यूल प्रबंधन प्रणाली में फेंकना चाहता हूं। फिर भी, ब्रंच पेज एक अच्छा, प्रासंगिक पढ़ा है। – Mitch

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