问题描述
我具有以下功能,用于检查用户浏览器中是否启用了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);
});