描述错误
使用兴农@ 6.1.0当我做sinon.useFakeTimers()
-我得到了一个错误:
TypeError: Cannot read property 'now' of undefined
at mirrorDateProperties (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:3644:1)
at hijackMethod (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:3947:1)
at Object.install (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:4337:1)
at useFakeTimers (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:4385:1)
at Sandbox.useFakeTimers (dist/webpack:/node_modules/sinon/pkg/sinon-esm.js:15390:1)
at Context.<anonymous> (dist/webpack:/tests/unit/Countdown.spec.js:23:1)
当我降级到sinon @ 5时-一切都很好!
上下文(请完成以下信息):
[email protected]
同样问题:失望:
[email protected]
可以正常工作
一个奇怪的现象。 我曾尝试使用香草Angular项目和Sinon 6.1.0复制此代码,但useFakeTimers()不会对我抛出任何错误,因此它可能是项目环境本身的问题。
从错误消息中,我猜想该变量将以某种方式变为未定义。
您认为@moraveyo可以将其简化为一个显示问题的最小示例吗?
Stack Overflow提供了有关如何创建最小,完整和可验证示例的指南
抱歉,我现在没有太多时间。
@mroderick我今天刚遇到这个问题。 这是一个复制该问题的小型存储库:这里。
该错误需要同时显示webpack
和jsdom
。 栈跟踪和一些调试显示该问题出现时lolex
试图访问_global.Date
这似乎并不对设置window
所产生jsdom
。
@LouisBrunner感谢您创建一个易于理解的可运行测试用例👍
使用您的存储库中的test:node
运行测试,它按预期失败。
当我仅使用mocha
运行测试时,它按预期通过。
失败的行是lolex-src.js#L131 ,正如您在分析中得出的结论。
如你结束,这样做的根本原因是, window
通过提供对象jsdom
不提供Date
对象。 lolex
需要能够引用全局范围才能正确运行,因此我们无法进行更改并直接引用Date
。
lolex
支持JSDOM场景,请查看lolex.withGlobal
// create a lolex implementation using node's `global`
const lolex = require("lolex").withGlobal(global);
const clock = lolex.install();
setTimeout(fn, 15); // Schedules with clock.setTimeout
clock.uninstall();
当不满足有关全局范围的假设时,我们当然可以改进lolex
来引发描述性错误,并建议作者使用withGlobal
。 您是否愿意为此提供拉取请求?
@mroderick Glad这个例子
我很乐意创建PR,但是只能修复lolex
。 有什么方法可以使sinon.useFakeTimers
在这种情况下工作? 也许通过在useFakeTimers
中添加一个像global
这样的参数,它可以用来在内部调用withGlobal
?
在这种情况下,是否有任何有关使sinon.useFakeTimers
可以使用的新更新。 在jsDom中使用Mocha时,我仍然遇到此异常
Error: The global scope doesn't have a `Date` object (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)
@LouisBrunner我喜欢这个想法,我认为该解决方案对大多数人都适用work
@mroderick我创建了一个PR(#1935),该PR实现了一种通过sinon.useFakeTimers
传递全局上下文的方式,我不知道您是否想到了那种API,因此请随时提供任何反馈!
由于此问题最近没有活动,因此已被自动标记为陈旧。 如果没有其他活动发生,它将关闭。 感谢你的贡献。
此问题已在#1935年修复。
我正在使用sinon 7.2.7 ,当我尝试使用sinon.useFakeTimers()
我得到了:
TypeError: Cannot set property performance of #<Window> which has only a getter
相同。
可能是Babel 7吗? https://github.com/babel/babel/issues/8363
@ cichy380和@axelhunn ,请发布问题报告。 此问题已解决。
最有用的评论
@mroderick我创建了一个PR(#1935),该PR实现了一种通过
sinon.useFakeTimers
传递全局上下文的方式,我不知道您是否想到了那种API,因此请随时提供任何反馈!