2011-06-24 11 views
6

जावास्क्रिप्ट प्रदूषण में वैश्विक नामस्थान को आम तौर पर बुरी चीज माना जाता है। यही कारण है कि कॉफ़ीस्क्रिप्ट (function() {}).call(this); रैपर में आपके सभी जावास्क्रिप्ट को लपेटता है।QUnit + कॉफ़ीस्क्रिप्ट स्कोप

हालांकि, मैंने अपने कॉफ़ीस्क्रिप्ट कोड के लिए क्विनीट परीक्षण लिखना शुरू कर दिया है, और QUNit शिकायत करता है कि यह मेरे कार्यों को नहीं ढूंढ सकता है।

1. Died on test #1: getGoodNamePart is not defined 
getGoodNamePart is not defined at Object.<anonymous> (file:///Users/kevin/Documents/docs/code/chrome/tests.js:2:10) at Object.run 

मैं वैश्विक नामस्थान प्रदूषित किए बिना चर का परीक्षण करना चाहता हूं। ऐसा करने का एक अच्छा तरीका क्या है?

यहाँ उत्पन्न जावास्क्रिप्ट मैं परीक्षण करना चाहते है:

(function() { 
getGoodNamePart = function(str) { 
    if (str.charAt(0) === '"') { 
     str.replace(/" <[^>]+>$"/g, ""); 
     str.replace(/"/g, ""); 
     return str; 
    } else if (str.charAt(0) === '<') { 
     str.replace(/<|>/g, ""); 
     return str; 
    } else { 
     return str; 
    } 
    }; 
}).call(this); 

और मेरे test.js फ़ाइल है:

test('getGoodNamePart()', function() { 
    equals(getGoodNamePart("\"Kev Burke\" <[email protected]>"), "Kev Burke", "\"name\" <email> works"); 
    equals(getGoodNamePart("", "", "empty string works")); 
    equals(getGoodNamePart("[email protected]", "[email protected]", "raw email works")); 
    return equals(getGoodNamePart("<[email protected]>", "[email protected]", "email inside carets -> carets get stripped")); 
}); 

धन्यवाद, केविन

+0

modularize नहीं है कुछ उदाहरण कोड उपयोगी होगा। –

+0

हाय हारून, मैंने एक उदाहरण जोड़ा। –

उत्तर

6

तो, आप कहते हैं कि तुम करना चाहते हैं ग्लोबल नेमस्पेस प्रदूषित किए बिना getGoodNamePart का परीक्षण करें। लेकिन, कॉफीस्क्रिप्ट स्वचालित रूप से प्रत्येक फ़ाइल को मॉड्यूलर करता है (अच्छी वजह से my answer here देखें), जिसका अर्थ है कि फ़ाइलों में फ़ंक्शंस तक पहुंचने का एकमात्र तरीका उन्हें कुछ वैश्विक ऑब्जेक्ट से जोड़ना है। (मैं यह सोचते कर रहा हूँ कि हम ब्राउज़र के बारे में यहाँ बात कर रहे हैं, न कि एक CommonJS वातावरण, इस तरह के Node.js है, जहां आप exports का उपयोग करेंगे के रूप में।)

है कि आप तीन विकल्प देता है:

  1. getGoodNamePart से window संलग्न करें। यह सबसे आसान है, क्योंकि केवल एक ही बदलाव getGoodNamePartwindow. (या केवल @) के साथ उपसर्ग कर रहा है, लेकिन निश्चित रूप से यह नामस्थान प्रदूषण को अधिकतम करता है।
  2. getGoodNamePart को window या global से पहले से जुड़ा हुआ कुछ और करने के लिए संलग्न करें।
  3. अपने परीक्षणों को उसी फ़ाइल के अंदर getGoodNamePart (जेएस दुनिया में असामान्य अभ्यास के रूप में ले जाएं, लेकिन एक विचार करने योग्य है, क्योंकि यह वैश्विक नामस्थान को छूता रहता है और आपको आसानी से आपके कोड और आपके परीक्षणों के बीच जाने देता है)।

मान लें कि आप # 2 के साथ जाना चाहते हैं, परीक्षण के लिए getGoodNamePart जैसे कार्यों को निर्यात करना। उन्हें "परीक्षण लक्ष्य" कहते हैं। एक परीक्षण लक्ष्य के साथ प्रत्येक फ़ाइल के शीर्ष पर,

window.testTargets ?= {} 

जोड़ सकते हैं और जब आप getGoodNamePart परिभाषित करते हैं,

testTargets.getGoodNamePart = getGoodNamePart = (str) -> 
    ... 

फिर लिखना अपने QUnit टेस्ट स्वीट के शीर्ष पर, लिखने

{getGoodNamePart} = testTargets 
समारोह प्राप्त करने के लिए

+0

महान जवाब, धन्यवाद ट्रेवर! –

2

मैं --bare ध्वज के साथ कॉफी फ़ाइल संकलन, परीक्षण के

$ coffee -c -b your_file

के लिए इस संकलित कोड