是否可以在JavaScript中模拟document.cookie?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (86)

document.cookie就像一个字符串,但它不是一个字符串。引用Mozilla文档中的示例:

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,怎么做到这一点?

提问于
用户回答回答于

你可以用cookiesetter和getter 来创建一个对象。这是一个非常简单的实现:

var mock = {
    value_: '', 

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

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

虽然可能不适用于所有浏览器(特别是IE)。更新:它只适用于支持ECMAScript 5的浏览器!

关于getter和setter的更多信息

mock.cookie = "name=oeschger";
mock.cookie = "favorite_food=tripe";
alert(mock.cookie);
// displays: name=oeschger;favorite_food=tripe;
用户回答回答于

上面的回答是正确的,我只想指出,在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"

扫码关注云+社区

领取腾讯云代金券