【问题标题】:QUnit/Sinon: testing a function which checks if cookies are enabledQUnit/Sinon:测试一个检查 cookie 是否启用的函数
【发布时间】:2014-12-31 04:31:15
【问题描述】:

我有以下(简化的)javascript 模块,它使用 jQuery Cookie 插件来检查是否启用了 cookie。如果 cookie 被禁用,它会警告用户:

var cookiePolicy = (function () {
    var cookiesEnabled = function () {
        return $.cookie('check', 'valid', { expires: 1 }) && $.cookie('check') == 'valid';
    };

    return {
        updateCookiePolicy: function () {
            if (!cookiesEnabled()) {
                $("#cookie-policy").append('<p id="cookie-warning">Cookies are disabled. Some features of this site may not work correctly.</p>');
            }
        }
    };
})();

我有以下单元测试:

QUnit.test("When cookies are enabled the cookie policy text remains unchanged", function (assert) {
    sinon.mock($).expects("cookie").once().withExactArgs("check", "valid", { expires: 1 });
    sinon.mock($).expects("cookie").once().withExactArgs("check").returns("valid");

    cookiePolicy.updateCookiePolicy();

    assert.equal(0, $('#cookie-warning').length, "Failed!");
});

测试失败,因为“cookie 已被包装”。我认为这是因为我在为 set 和 read 嘲笑 $.cookie。如何在此测试中模拟对 $.cookie 的调用以进行设置和读取?

【问题讨论】:

  • 您是否收到来自 QUnit 的错误?还是只是一次失败的测试?您可以将整个输出粘贴为您的问题的更新吗?我认为解决方案是正确检查 cookie 模拟是否预期出现,每次模拟 cookie 时它都会生成一个新对象,但您实际上并没有检查该返回值。

标签: javascript jquery unit-testing qunit sinon


【解决方案1】:

你的假设是正确的。根据您使用的 Sinon 版本,您可以执行以下操作:

// UUT
var foo = {
    bar: function() {}
};

// Test setup
var mock = sinon.mock(foo);
var expectation = mock.expects('bar').twice();
expectation.onFirstCall().stub.calledWithExactly('baz');
expectation.onSecondCall().stub.calledWithExactly('qux');

// Test
foo.bar('baz');
foo.bar('qux');
mock.verify();

顺便说一句,使用 Sinon 模拟而不使用 .verify() 很奇怪。也许存根会更合适?

【讨论】:

    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 2021-01-07
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    相关资源
    最近更新 更多