document.cookie
类似于字符串,但它不是字符串。引用Mozilla doc中的示例
document.cookie = "name=oeschger";
document.cookie = "favorite_food=tripe";
alert(document.cookie);
// displays: name=oeschger;favorite_food=tripe
如果您尝试仅使用一个字符串创建模拟cookie,则不会得到相同的结果:
var mockCookie = "";
mockCookie = "name=oeschger";
mockCookie = "favorite_food=tripe";
alert(mockCookie);
// displays: favorite_food=tripe
因此,如果您想对在cookie上操作的模块进行单元测试,并且想要使用模拟cookie进行这些测试,可以吗?How?
发布于 2011-06-23 23:20:50
您可以使用cookie
的setter和getter创建一个对象。下面是一个非常简单的实现:
var mock = {
value_: '',
get cookie() {
return this.value_;
},
set cookie(value) {
this.value_ += value + ';';
}
};
可能并不是所有的浏览器都能工作(尤其是IE)。更新:它只能在支持ECMAScript 5的浏览器中工作!
。
mock.cookie = "name=oeschger";
mock.cookie = "favorite_food=tripe";
alert(mock.cookie);
// displays: name=oeschger;favorite_food=tripe;
发布于 2013-04-24 22:27:28
此实现允许覆盖cookies,并添加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);
发布于 2011-06-23 23:54:23
@Felix Kling的答案是正确的,我只是想指出在ECMAScript 5中定义setter和getter有另一种语法:
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"
同样,大多数浏览器支持MSIE5(由ECMA262第5版定义),但不支持ECMAScript (或JScript)。
https://stackoverflow.com/questions/6456429
复制相似问题