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

新手上路,请多包涵

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,可以吗? 如何?

原文由 thisgeek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 496
2 个回答

您可以使用 cookie setter 和 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;

演示

原文由 Felix Kling 发布,翻译遵循 CC BY-SA 3.0 许可协议

此实现允许覆盖 cookie,并添加 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);

原文由 mcintyre321 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题