2015-03-29 3 views
10

से मोचा जेएस में ग्लोबल विंडो वेरिएबल के साथ काम करना मैं जेएस यूनिट परीक्षण के लिए नया हूं और मैं अपने रीढ़ की हड्डी संपर्क प्रबंधक ट्यूटोरियल के लिए मोचा का उपयोग करने की कोशिश कर रहा हूं जो मुझे this github repo पर मिला। हालांकि, मेरे पास एक वैश्विक विंडो है। कॉन्टैक्ट मैनेजर वैरिएबल जो मैंने पहली बार जांचना चाहता था कि यह मौजूद है या नहीं और बाद में स्टार्ट फ़ंक्शन के अंदर राउटर.ऑन कार्यक्षमता का परीक्षण करें। चर तो दिखाई देता है:नोच

window.ContactManager = { 
    Models: {}, 
    Collections: {}, 
    Views: {}, 

    start: function(data) { 
    var contacts = new ContactManager.Collections.Contacts(data.contacts), 
     router = new ContactManager.Router(); 

    router.on('route:home', function() { 
     router.navigate('contacts', { 
     trigger: true, 
     replace: true 
     }); 
    }); 

    router.on('route:showContacts', function() { 
     var contactsView = new ContactManager.Views.Contacts({ 
     collection: contacts 
     }); 
..... 

मेरा परीक्षण है कि काम नहीं करता है:। var = आवश्यकता उम्मीद ('चाय') की उम्मीद;

describe("Application", function() { 
    it('creates a global variable for the name space ContactManager' , function() { 
     expect(ContactManager).to.exist; 
    }) 
}); 

मैं कंसोल में परीक्षण चलाने से मोचा में वैश्विक विंडो परिवर्तनीय अस्तित्व का परीक्षण और उपयोग कैसे करूं?

+0

'उम्मीद (window.ContactManager) .to.exist चलाने;'? –

+0

हां। मैंने सोचा कि पहला परीक्षण यह जांचना होगा कि यह मौजूद है या नहीं और फिर स्टार्ट फ़ंक्शन के अंदर राउटर ट्रिगर्स का परीक्षण करें। कृपया संपादन देखें – ivan

उत्तर

12

आप ब्राउज़र में जावास्क्रिप्ट कोड चलाने और नोड में जावास्क्रिप्ट कोड चलाने के बीच अंतर को अनदेखा कर रहे हैं।

ब्राउज़र में, window नाम उस ऑब्जेक्ट का संदर्भ है जिसमें आपके सभी वैश्विक चर शामिल हैं। तो जब आप बाहरीतम दायरे में foo = 1 करते हैं, तो आप वैश्विक foo घोषित करते हैं, जो window.foo के रूप में भी पहुंच योग्य है। इसके विपरीत, यदि आप इस तरह एक नया फ़ील्ड असाइन करते हैं: window.bar = 1, तो आपके पास bar नामक एक नया ग्लोबल है।

नोड में, आपकी वैश्विक वस्तु global के रूप में उपयोग की जाती है। तो यदि आप बाहरीतम दायरे में foo = 1 करते हैं, तो fooglobal.foo के रूप में भी पहुंच योग्य है। और यदि आप global.bar = 1 करते हैं, तो आपके पास bar नामक एक नया वैश्विक डोमेन है।

आपका कोड दिखाता है कि आप window ऑब्जेक्ट को संशोधित करते हैं, जो वैश्विक ऑब्जेक्ट का संदर्भ नहीं प्रतीत होता है। विकल्प:

  1. नोड के बजाय ब्राउज़र में मोचा चलाएं। Mocha's documentation देखें।

  2. अपने नोड पर्यावरण को सेट करें ताकि यह नोड को संतुष्ट करने के लिए पर्याप्त ब्राउज़र वातावरण की नकल कर सके। window वैरिएबल को globalके बराबर होने के लिए पर्याप्त हो सकता है लेकिन मुझे यह जानने के लिए पर्याप्त बैकबोन नहीं पता कि बैकबोन इससे खुश होगा या नहीं।

  3. jsdom में अपना बैकबोन-आधारित कोड चलाएं। Jsdom यथार्थवादी window और document प्रदान करता है, जैसे कि आपका कोड ब्राउज़र में चल रहा था, लेकिन इसकी सीमाएं हैं। मुझे नहीं पता कि बैकबोन उन सीमाओं से खुश होगा या नहीं।

3

एक अन्य समाधान, https://www.npmjs.com/package/window-or-global

import React, { Component } from 'react' 
// in node, you'll get the global object instead of crashing by an error 
import root from 'window-or-global' 

class MyComponent extends Component { 

    // this method is only invoked in the browser environment 
    componentDidMount() { 
    root.addEventListener(/*...*/) 
    } 

    componentWillUnmount() { 
    root.addEventListener(/*...*/) 
    } 

    render() {} 

} 

// Voilà. Enjoy your universal react component! ;) 
// No more 'window is not defined' errors when you render your component 
// on server side. 

स्थापित करने के लिए उपयोग करने के लिए किया जाएगा npm install --save window-or-global