2012-01-19 16 views
36

मैं खिड़की वस्तु कैसे नकली हैं? मैं फ़ायरफ़ॉक्स एक्सटेंशन कर रहा हूं और मैं जावास्क्रिप्ट परीक्षण के लिए जैस्मीन का उपयोग करना चाहता हूं।चमेली नकली खिड़की वस्तु

मेरी जावास्क्रिप्ट में मैं

 

function submit() { 
... 
var url = window.arguments[0]; 
... 
} 
 

जाहिर है, मैं [0] चमेली में window.arguments उपहास करने के लिए क्योंकि उस वस्तु अगर window.openDialog

से

किसी भी पैरामीटर गुजर नहीं मौजूद नहीं है है इस के साथ यह उपहास करने के लिए "के साथ"

 

it("should submit to server", function() { 

     var localContext = { 
      "window": { 
       arguments: ["http://localhost"] 
      } 

     } 

     with(localContext); 
 

मेरी प्रयास है लेकिन मैं अभी भी इस त्रुटि लेखन त्रुटि मिलती है: संपत्ति पढ़ा नहीं जा सकता '0' अपरिभाषित की, जब यह परीक्षण windo चलाया जाता है की तरह है w.arguments [0] वास्तविक खिड़की के साथ नष्ट हो जाता है, क्योंकि अगर मैं परीक्षण के अंदर

window.arguments[0]

करते हैं, यह प्रिंट बाहर "http: // स्थानीय होस्ट" सही ढंग से। लेकिन जब सबमिट करने की बात आती है() विधि यह त्रुटि दिखाती है कि window.argument अपरिभाषित है।

उत्तर

52

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

कौन सा मुझे dependency injection लिए लाता है। इकाई पर फ़ोकस के साथ, आपकी कोड इकाई टेस्ट करने योग्य बनाने के लिए यह एक आम पैटर्न है। इसका क्या मतलब है जब भी आप कोई नई ऑब्जेक्ट बनाते हैं या किसी वैश्विक ऑब्जेक्ट तक पहुंचते हैं, तो आप न केवल अपने इकाई कार्यक्षमता का परीक्षण कर रहे हैं, बल्कि आपके नव निर्मित या वैश्विक ऑब्जेक्ट की कार्यक्षमता भी देख रहे हैं। कि पहले जोड़ें लिए, आप अपने इकाई में नई वस्तुओं का निर्माण नहीं है, लेकिन उन्हें में पारित। आम तौर पर आप इसे कन्स्ट्रक्टर में करना चाहते हैं, लेकिन जैसा कि जावास्क्रिप्ट फ़ंक्शन में फ़ंक्शन बॉडी के साथ कन्स्ट्रक्टर के रूप में ऑब्जेक्ट होते हैं, आप निर्भरता को अपने फ़ंक्शन में भी पास कर सकते हैं।

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

youWannaTest(window); 
:

function youWannaTest(w){ 
    console.log(w.arguments[0]); 
} 

अपने विस्तार में इस तरह फ़ंक्शन को कॉल करें

अपने परीक्षण कॉल के दौरान इस तरह समारोह:

youWannaTest({arguments: ['someValue']}); 
+0

उत्तर के लिए धन्यवाद, इसलिए मुझे लगता है कि नकली अप नहीं कर सकते? – toy

+0

ने थोड़ा सा स्पष्ट करने के लिए मेरा उत्तर अपडेट किया। –

1

मैं भी लगता है निर्भरता इंजेक्शन साफ ​​समाधान है।

आपका जे एस:

function submit(_window) { 
    _window = _window || window 
    ... 
    var url = _window.arguments[0]; 
    ... 
} 

आपका इकाई परीक्षण:

it('works like a dream', function() { 
    var _window = { arguments: ['url'] } 
    expect(submit(_window)).toBeTotallyAwesome() 
}) 
0

हाँ, आप विंडो वस्तु नकली कर सकते हैं।$ खिड़की साथ खिड़की बदलें:

पहली बात करना होगा अपने जे एस कोड में एक परिवर्तन करना है।

फिर, आप विंडो नीचे दिए गए कोड का उपयोग कर नकली कर सकते हैं:

var window = { 
    arguments : ['url'] 
}; 
अब अपनी कल्पना फ़ाइल में

: beforeEach में ब्लॉक

$controller('controllerName', {$window : window}); 
संबंधित मुद्दे