【问题标题】:Sinon alert stub: "Attempted to wrap alert which is already wrapped"Sinon 警报存根:“尝试包装已包装的警报”
【发布时间】:2015-07-13 23:06:06
【问题描述】:

我使用的是诗浓 1.14。我想使用 Sinon 的存根抑制所有 javascript 警报。

使用最新的 Chrome 版本:42.0.2311.135 m,我收到异常:“尝试包装已包装的警报”

下面的代码在最新的 Firefox 中运行良好。我会用小提琴更新。

var hooks = {

    beforeEach: function(assert){
        this.sandbox = sinon.sandbox.create();
        this.sandbox.stub(window, 'alert', function (msg) { return false; });
    },

    afterEach: function(){
        this.sandbox.restore();
    }
};

module('example', hooks);

test('example', function(assert){
    ok(true, 'does not throw an exception');
});

【问题讨论】:

    标签: javascript qunit sinon


    【解决方案1】:

    将 Sinon 从 1.14 更新到 1.14.1 似乎可以解决问题。我认为这是一个错误?

    附带说明,代码在 1.12 中也可以正常运行。

    【讨论】:

    • +1 用于您在上面的评论:“请注意 this.sandbox.restore(); 在每次测试之后。这应该可以防止它重复包装”。您应该将其添加到答案中:我使用的是 2.1.0 版,但仍然遇到同样的问题!
    【解决方案2】:

    window.alert 是一个全局函数。每次beforeEach 运行时,它都会将该函数替换为一个包装函数。我猜 Sinon 会阻止您将函数包装两次。

    您可以确保设置功能只运行一次。

    或者修改您的代码,使您没有全局依赖项(即传递对alert 的引用或委托window 对象)。这会极大地影响您的代码架构。这也说明了为什么在设计架构时考虑测试很重要。

    【讨论】:

    • 每次测试后请注意this.sandbox.restore();。这应该可以防止它包裹两次
    • 也许afterEach 中的thisbeforeEach 中的this 不同?验证函数是否已解包。
    • 是的。如果我在restore() 之前和之后检查沙箱,它会被正确清空...
    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 2012-02-08
    • 2019-09-22
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    相关资源
    最近更新 更多