测试功能,用于检查Qunit是否启用了cookie

问题描述

我具有以下功能,用于检查用户浏览器中是否启用了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是只读的。您可以尝试伪造浏览器,但实际上,您应该只注入您感兴趣的属性以供使用。这样,您可以覆盖浏览器设置或对其进行测试!请注意,增加了两个参数(因为您还需要绕过cookie设置的双重检查)。

附加的flag参数是一个布尔值,它实际上告诉该函数cookieEnabled的值是什么(与使用navigator.cookieEnabled相比)。但是,如果缺少该参数,则代码将使用浏览器设置。换句话说,这是一种“注入”您想要的值的方法,在测试中非常有用。这不是理想的选择,但是如果没有更多的工作和模拟(使用禁用了Cookie的无头浏览器),您可以做很多其他事情。

这是这项工作的精妙之处: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);
});

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...