Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to mock document.cookie in JavaScript?

document.cookie is like a string, but it is not a string. To quote the example from the Mozilla doc:

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

If you tried to make a mock cookie using only a string, you would not get the same results:

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

So, if you wanted to unit test a module that operates on the cookie, and if you wanted to use a mock cookie for those tests, could you? How?

like image 900
thisgeek Avatar asked Jun 23 '11 15:06

thisgeek


People also ask

Can we manipulate cookie using JavaScript?

JavaScript can also manipulate cookies using the cookie property of the Document object. JavaScript can read, create, modify, and delete the cookies that apply to the current web page.

Are document cookies asynchronous?

The Cookie Store API is asynchronous, and therefore is allowed in service workers. Interacting with the cookies works the same way in document contexts and in service workers. // Works in documents and service workers.

What is mocking in JavaScript?

Mock functions allow you to test the links between code by erasing the actual implementation of a function, capturing calls to the function (and the parameters passed in those calls), capturing instances of constructor functions when instantiated with new , and allowing test-time configuration of return values.

Can JavaScript read all cookies?

You cannot. By design, for security purpose, you can access only the cookies set by your site.


2 Answers

You could create an object with a cookie setter and getter. Here is a very simple implementation:

var mock = {     value_: '',       get cookie() {         return this.value_;     },      set cookie(value) {         this.value_ += value + ';';     } }; 

Might not work in all browsers though (especially IE). Update: It only works in browsers supporting ECMAScript 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

like image 118
Felix Kling Avatar answered Oct 17 '22 01:10

Felix Kling


This implementation allows overwriting cookies, and adds 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); 
like image 34
mcintyre321 Avatar answered Oct 17 '22 02:10

mcintyre321