<p>在 IE11 中恢复窗口对象中的存根属性时 sinon 失败</p>

创建于 2018-08-22  ·  4评论  ·  资料来源: sinonjs/sinon

描述错误
可以存根,但不能在 IE11 中恢复 window 对象中的某些属性,导致 sinon 抛出类型错误: TypeError: Cannot redefine non-configurable property '...'

再现
https://jsbin.com/qixexucasa/edit?js ,console,output - 比较 IE11 和任何其他浏览器中的行为。

"TypeError: Cannot redefine non-configurable property 'parent'
   at restore (https://unpkg.com/[email protected]/pkg/sinon.js:3253:13)
   at Global code (https://null.jsbin.com/runner:18:1)"

预期行为
在 IE11 中,window 对象的某些属性是不可配置的,但仍然可以存根它们,这在测试中非常有用。 可预期的行为将是其中之一:

  1. sinon 应该在存根步骤(而不是在 restore() 步骤上)抛出一个错误,即不可能存根这个属性;
  2. 当存根属性 sinon 不应复制原始configurable属性时,有什么原因吗? 在false值的情况下, sinon 只会为自己制造问题,因此无法恢复它。 所以这一行应该总是true
    https://github.com/sinonjs/sinon/blob/638e104d1e6ed9908c1b09bd33d2cba1aa8c217a/lib/sinon/default-behaviors.js#L251

语境:

  • 库版本:所有版本都受到影响,在 4.4.6 和 6.1.5 中测试。

请确认这是错误还是预期行为。

Bug Help wanted hacktoberfest pinned

最有用的评论

我遇到了同样的问题,我在 sinon/default-behaviors.js 第 258 行找到了原因。

value: function value(fake, newVal) {
    var rootStub = fake.stub || fake;

    Object.defineProperty(rootStub.rootObj, rootStub.propName, {
        value: newVal,
        enumerable: true,
        configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)
    });

    return fake;
}

我不知道为什么它应该遵循原始对象的可配置选项。 我认为它必须始终正确,因为在存根之后,无论原始对象的选项如何,它都可以恢复或重写(通常是 sinon.restore())。

我暂时通过更改该代码始终返回 true 来解决此问题。

所有4条评论

感谢您对问题的详细描述。

使用第二个策略真的可以在 IE11 中工作吗? 如果是这样,那将是我的偏好。

您是否愿意贡献拉取请求以进行必要的更改?

此问题已自动标记为过时,因为它最近没有活动。 如果没有进一步的活动发生,它将被关闭。 感谢你的贡献。

此问题已自动标记为过时,因为它最近没有活动。 如果没有进一步的活动发生,它将被关闭。 感谢你的贡献。

我遇到了同样的问题,我在 sinon/default-behaviors.js 第 258 行找到了原因。

value: function value(fake, newVal) {
    var rootStub = fake.stub || fake;

    Object.defineProperty(rootStub.rootObj, rootStub.propName, {
        value: newVal,
        enumerable: true,
        configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)
    });

    return fake;
}

我不知道为什么它应该遵循原始对象的可配置选项。 我认为它必须始终正确,因为在存根之后,无论原始对象的选项如何,它都可以恢复或重写(通常是 sinon.restore())。

我暂时通过更改该代码始终返回 true 来解决此问题。

此页面是否有帮助?
0 / 5 - 0 等级