检查 Qunit 是否启用 cookie 的测试功能

Testing function which checks if cookies are enabled with Qunit

我有以下功能可以检查用户浏览器中是否启用了 cookie:

CookiesEnabled: function() {
    var cookieEnabled = navigator.cookieEnabled;
    if (!cookieEnabled) {
        document.cookie = "test_cookie";
        cookieEnabled = document.cookie.indexOf("test_cookie") != -1;
    }

    return cookieEnabled;
},

我想使用 Sinon/Qunit 对其进行单元测试,但我不确定如何正确处理这个问题,因为我对 Sinon 或 QUnit 的使用经验不多。这是我尝试进行的测试:

QUnit.test("CookiesEnabled - returns true if user has enabled cookies in their browser", function (assert) {
    sinon.stub(CookieHelper, "CookiesEnabled")
         .callsFake(function () {});

    var result = CookieHelper.CookiesEnabled();

    Assert.Equal(result, true);

    CookieHelper.CookiesEnabled.restore();
});

谁能指出我使用 Qunit 和 Sinon 对该方法进行单元测试的正确方向?谢谢。

更新尝试:

QUnit.test("CookiesEnabled - returns true if user has enabled cookies in their browser", function (assert) {
    sinon.stub(navigator, "cookieEnabled").callsFake(function () {
        return true;
    });

    var result = CookieHelper.CookiesEnabled();

    assert.equal(result, true);

});

如前所述,window.navigator 是只读的。有些东西你可以尝试伪造浏览器,但实际上,你应该只注入你感兴趣的属性以供函数使用。这样您就可以覆盖浏览器设置或对其进行测试!注意添加了两个参数(因为您还需要绕过 double-checking 的 cookie 设置)。

附加的 flag 参数是一个布尔值,它本​​质上告诉函数 cookieEnabled 的值应该是什么(相对于使用 navigator.cookieEnabled)。但是,如果缺少该参数,代码将使用浏览器设置。换句话说,这是一种“注入”你想要的值的方法,在测试中非常有用。这并不理想,但如果没有更多的工作和模拟(使用禁用 cookie 的无头浏览器),您将无能为力。

这是这个工作的 jsfiddle:https://jsfiddle.net/e5mtpboy/

CookiesEnabled: function(flag, bypassTest) {
    var cookieEnabled = typeof(flag) === 'boolean' ? flag : navigator.cookieEnabled;
    if (!cookieEnabled && !bypassTest) {
        document.cookie = "test_cookie";
        cookieEnabled = document.cookie.indexOf("test_cookie") != -1;
    }

    return cookieEnabled;
}

然后在你的测试中:

QUnit.test("CookiesEnabled - returns true if user has enabled cookies in their browser", function (assert) {
    var result = CookieHelper.CookiesEnabled(true);
    assert.equal(result, true);
});

QUnit.test("CookiesEnabled - returns true if user has disabled cookies, but we can still set one", function (assert) {
    var result = CookieHelper.CookiesEnabled(false);
    assert.equal(result, true);
});

QUnit.test("CookiesEnabled - returns false if browser does not support cookies", function (assert) {
    var result = CookieHelper.CookiesEnabled(false, true);
    assert.equal(result, false);
});