2013-02-25 64 views
17
  1. मेरे पास एक वेब एप्लिकेशन है जो ऑफ़लाइन पहुंच के लिए window.applicationCache का उपयोग करता है।
  2. मेरे सभी कोड जो ऐप कैश (उदाहरण के लिए चेकिंग/अपडेट/कैश को स्वैपिंग) प्रबंधित करते हैं, "कैश-नियंत्रक" ऑब्जेक्ट में encapsulated है।
  3. मेरे पास "कैश-नियंत्रक" फ़ंक्शन का परीक्षण करने के लिए यूनिट परीक्षण हैं। परीक्षण के लिए, मैं अस्थायी रूप से देशी विंडो को बदलता हूं। एप्लिकेशन को अपने स्वयं के मॉक संस्करण के साथ ऑब्जेक्ट करें (क्योंकि मैं केवल मेरा कोड परीक्षण करना चाहता हूं, ब्राउज़र ऐप कैश कार्यान्वयन नहीं), उदाहरण के लिए।वैश्विक विंडो ऑब्जेक्ट की आवश्यकताएँ .js

    window.applicationCache = { /* my appCache mock */ }; 
    // unit tests run here. Code under test references window.applicationCache. 
    

एक समय पहले (लगभग। क्रोम 16) इस दृष्टिकोण पूरी तरह से काम किया। फिर क्रोम 17, मैक & दोनों विंडोज प्लेटफार्मों पर, ब्राउजर की डिफ़ॉल्ट विंडो पर पैच करने की क्षमता हटा दी गई है। एप्लिकेशंस कैश प्रॉपर्टी (उत्सुकता से, यह अभी भी क्रोम के लिए क्रोम में ठीक है और क्रोम 26 सहित सभी संस्करणों के लिए ठीक काम करता है)। उस समय, मैं इसके लिए logged a Chromium bug; लेकिन दुर्भाग्यवश कि बग रिपोर्ट अभी भी 'पुष्टिकृत' के रूप में सूचीबद्ध है। एएमडी शैली मॉड्यूल के लिए, मॉड्यूल लोडर के रूप में require.js उपयोग करते हुए;

वैसे भी, मैं सिर्फ पारंपरिक 'ब्राउज़र वैश्विक' से अपने आवेदन पोर्ट किया है (सभी जे एस वस्तुओं वैश्विक हैं। यानी लोड हो रहा है * स्क्रिप्ट टैग के माध्यम से फ़ाइलों .js)।

एएमडी (या कॉमनजेएस) के लाभों में से एक निर्भरता-इंजेक्शन है, जहां आपका कोड स्थानीय संदर्भ किसी वैश्विक संदर्भ पर निर्भर होने के बजाय किसी भी निर्भर वस्तुओं पर मिलता है, उदाहरण के लिए।

require(['foo'], function(Foo) { 
    var bar = new Foo(); 
}); 

... जो है, यह वस्तु मजाक करने के लिए आसान हो जाता है के बाद से आप मॉड्यूल लोडर कॉन्फ़िगर जब परीक्षण मोड में 'foo' के लिए एक नकली वस्तु पारित करने के लिए कर सकते हैं।

मुझे आशा थी कि निर्भरता-इंजेक्शन पर जाकर, मैं अपने आवेदन के आसपास हो सकता हूं कैश मुद्दा (क्योंकि मेरे मॉड्यूल में पारित 'विंडो' संदर्भ या तो वैश्विक विंडो ऑब्जेक्ट या मॉक ऑब्जेक्ट हो सकता है)।

हालांकि मुझे यकीन नहीं है कि कैसे आवश्यक है .js 'मॉड्यूल' को मेरे मॉड्यूल में निर्भरता के रूप में इंजेक्ट करें?

क्या यह संभव है (शायद shim config का उपयोग कर?) 'विंडो' मॉड्यूल को परिभाषित करने के लिए; जिसे ग्लोबल 'विंडो' ऑब्जेक्ट पर संचालित किसी भी कोड पर भेजा जा सकता है? ताकि मैं ऐसा कुछ कर सकूं:

require(['???'], function(window) { 
    // 'window' here is the real window object, or for testing it's a mock window object 
    window.applicationCache.update(); 
}); 

... जहां '???' एक मॉड्यूल नाम है जो विंडो ऑब्जेक्ट को संदर्भित करता है।

या मुझे अपने स्वयं के मॉड्यूल को परिभाषित करने की आवश्यकता होगी जो 'विंडो' निर्यात करता है, जो इकाई परीक्षण के लिए अलग-अलग मैप किया जा सकता है, उदाहरण के लिए।

// window.js 
define(function() { 
    return window; // real global window object 
}); 

// window-mock.js 
define(function() { 
    return { 
    applicationCache: { /* mock version of appCache */ } 
    } 
}); 

// for unit testing, remap 'window' to the mock version 
require.config({ 
    map: { 
    "cache-controller": { 
     "window": "window-mock" 
    } 
    } 
}); 

// cache-controller.js 
require(['window'], function(window) { 
    window.applicationCache.update(); 
}); 

उत्तर

6

मैंने अपने स्वयं के प्रश्न का उत्तर दिया। मैंने ऊपर वर्णित window.js और window-mock.js मॉड्यूल बनाने का निर्णय लिया, जिसने मुझे यूनिट परीक्षण चलाते समय नकली संस्करण पारित करने की अनुमति दी, और सामान्य रूप से चलते समय 'असली' विंडो ऑब्जेक्ट का उपयोग किया।