2011-06-23 19 views
17

document.cookie एक स्ट्रिंग की तरह है, लेकिन यह एक स्ट्रिंग नहीं है। Mozilla doc से उदाहरण के शब्दों में:क्या जावास्क्रिप्ट में document.cookie को मॉक करना संभव है?

document.cookie = "name=oeschger"; 
document.cookie = "favorite_food=tripe"; 
alert(document.cookie); 
// displays: name=oeschger;favorite_food=tripe 

आप केवल एक स्ट्रिंग का उपयोग एक नकली कुकी करने की कोशिश की, तो आप नहीं एक ही परिणाम प्राप्त होगा:

var mockCookie = ""; 
mockCookie = "name=oeschger"; 
mockCookie = "favorite_food=tripe"; 
alert(mockCookie); 
// displays: favorite_food=tripe 

इसलिए, यदि आप चाहते थे यूनिट के लिए कुकी पर चलने वाले मॉड्यूल का परीक्षण करें, और यदि आप उन परीक्षणों के लिए नकली कुकी का उपयोग करना चाहते हैं, तो क्या आप? कैसे?

+0

अधिक हाल के वेब ब्राउज़र में गेटर्स और सेटर्स। – zzzzBov

+0

आप इस उद्देश्य के लिए लिखे गए एक साधारण मॉक ऑब्जेक्ट को आजमा सकते हैं: https://github.com/RichardKnop/CookieMock –

उत्तर

14

आप cookie सेटर और गेटर के साथ एक ऑब्जेक्ट बना सकते हैं। यहां एक बहुत ही सरल कार्यान्वयन है:

var mock = { 
    value_: '', 

    get cookie() { 
     return this.value_; 
    }, 

    set cookie(value) { 
     this.value_ += value + ';'; 
    } 
}; 

हालांकि सभी ब्राउज़रों (विशेष रूप से आईई) में काम नहीं कर सकता है। अद्यतन: यह केवल ईसीएमएस्क्रिप्ट 5 का समर्थन करने वाले ब्राउज़र में काम करता है!

More about getter and setters

mock.cookie = "name=oeschger"; 
mock.cookie = "favorite_food=tripe"; 
alert(mock.cookie); 
// displays: name=oeschger;favorite_food=tripe; 

DEMO

+0

तो, आप जो कहते हैं वह यह है कि आप व्यवहार की नकल कर सकते हैं, लेकिन इंटरफ़ेस _cannot_ समान हो । क्या वह सही है? – thisgeek

+0

@thisgeek: सुनिश्चित नहीं है कि आपका क्या मतलब है ... यह वही इंटरफ़ेस है या क्या मुझे कुछ याद आ रही है? –

+0

मैंने जो लिखा है उसे मैंने गलत समझा।'Get' और 'कुकी' के बीच कोई' '' नहीं था, लेकिन मेरे दिमाग ने वैसे भी इसे रखा। इसका मतलब है कि आपका समाधान जेएस इंजन में ईसीएमएस्क्रिप्ट 5 समर्थन पर निर्भर करता है, जिसके साथ मैं रह सकता हूं। – thisgeek

8

@Felix किंग्स जवाब सही पर, मैं सिर्फ बाहर बात करने के लिए ECMAScript 5 में setters और getters को परिभाषित करने के लिए एक वैकल्पिक वाक्य रचना है कि वहाँ की तलाश है:

function MockCookie() { 
    this.str = ''; 
    this.__defineGetter__('cookie', function() { 
    return this.str; 
    }); 
    this.__defineSetter__('cookie', function(s) { 
    this.str += (this.str ? ';' : '') + s; 
    return this.str; 
    }); 
} 
var mock = new MockCookie(); 
mock.cookie = 'name=oeschger'; 
mock.cookie = 'favorite_food=tripe'; 
mock.cookie; // => "name=oeschger;favorite_food=tripe" 

और फिर , अधिकांश ब्राउज़र ईसीएमएस्क्रिप्ट 5 का समर्थन करते हैं (ईसीएमए -262 5 वें संस्करण द्वारा परिभाषित) लेकिन एमएसआईई (या जेस्क्रिप्ट)।

6

इस कार्यान्वयन कुकीज़ को अधिलेखित करने की अनुमति देता है, और कहते हैं document.clearCookies()

(function (document) { 
    var cookies = {}; 
    document.__defineGetter__('cookie', function() { 
     var output = []; 
     for (var cookieName in cookies) { 
      output.push(cookieName + "=" + cookies[cookieName]); 
     } 
     return output.join(";"); 
    }); 
    document.__defineSetter__('cookie', function (s) { 
     var indexOfSeparator = s.indexOf("="); 
     var key = s.substr(0, indexOfSeparator); 
     var value = s.substring(indexOfSeparator + 1); 
     cookies[key] = value; 
     return key + "=" + value; 
    }); 
    document.clearCookies = function() { 
     cookies = {}; 
    }; 
})(document); 
+0

वास्तविक कार्यान्वयन का पालन करने के लिए ";" विभाजक के साथ जुड़ना चाहिए: 'output output.join ("; ");' – Alvis

0

निजी तौर पर मैं दस्तावेज़ वस्तु का अपहरण करने में असमर्थ था।

var fakeCookie = { 
    cookies: [], 
    set: function (k, v) { 
     this.cookies[k] = v; 
    }, 
    get: function (k) { 
     return this.cookies[k]; 
    }, 
    reset: function() { 
     this.cookies = []; 
    } 
}; 
तब मेरे beforeEach में

() मैं अपने कुकी को परिभाषित: एक सरल समाधान है जिसके लिए मुझे पीछा कर रहा था काम करने के लिए लगता है ...

अपने परीक्षण स्क्रिप्ट के शीर्ष पर मैं एक fakeCookie वस्तु को परिभाषित ठूंठ। (! बजाय) यह मूलतः jQuery.cookie और करने के लिए कॉल को बीच में रोक कॉलबैक फ़ंक्शन कि मैं परिभाषित किया है फोन (देखें नीचे):

beforeEach(function() { 
    var cookieStub = sinon.stub(jQuery, "cookie", function() { 
     if (arguments.length > 1) { 
      fakeCookie.set(arguments[0], arguments[1]); 
     } 
     else { 
      return fakeCookie.get(arguments[0]); 
     } 
    }); 
}); 

किसी भी समय है कि मैं मिलता है या एक कुकी मान सेट यह मेरी fakeCookie बजाय का उपयोग करता है की वास्तविक jQuery.cookie। यह पारित पैरामीटर की संख्या को देखकर करता है और यह प्राप्त करता है कि यह एक प्राप्त/सेट है या नहीं। मैंने सचमुच इसे चिपकाया और यह सब बल्ले से सीधे काम किया। उम्मीद है कि यह मदद करता है !!

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