Sinon: sinon.useFakeTimers()时出现“ TypeError:无法读取未定义的属性'now'”

创建于 2018-07-05  ·  15评论  ·  资料来源: sinonjs/sinon

描述错误
使用兴农@ 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时-一切都很好!

我的回购:
https://github.com/moraveyo/chess-clock/blob/bf764f3ed9026366de9375bbc870109e4f007099/tests/unit/Countdown.spec.js#L23

上下文(请完成以下信息):

  • 库版本:6.1.0
  • 环境:Ubuntu 16.04
  • 范例网址:
  • 您正在使用的其他库:

    • “ vue”:“ ^ 2.5.16”,

    • “ vue-router”:“ ^ 3.0.1”

    • “ @ vue / cli-plugin-babel”:“ ^ 3.0.0-beta.15”,

    • “ @ vue / cli-plugin-eslint”:“ ^ 3.0.0-beta.15”,

    • “ @ vue / cli-plugin-unit-mocha”:“ ^ 3.0.0-beta.15”,

    • “ @ vue / cli-service”:“ ^ 3.0.0-beta.15”,

    • “ @ vue / eslint-config-airbnb”:“ ^ 3.0.0-rc.3”,

    • “ @ vue / test-utils”:“ ^ 1.0.0-beta.16”,

    • “ chai”:“ ^ 4.1.2”,

    • “ vue-template-compiler”:“ ^ 2.5.16”

    • 摩卡5.2.0

    • Webpack 4.15.1

Help wanted stale

最有用的评论

@mroderick我创建了一个PR(#1935),该PR实现了一种通过sinon.useFakeTimers传递全局上下文的方式,我不知道您是否想到了那种API,因此请随时提供任何反馈!

所有15条评论

[email protected]同样问题:失望:
[email protected]可以正常工作

一个奇怪的现象。 我曾尝试使用香草Angular项目和Sinon 6.1.0复制此代码,但useFakeTimers()不会对我抛出任何错误,因此它可能是项目环境本身的问题。

从错误消息中,我猜想该变量将以某种方式变为未定义。

您认为@moraveyo可以将其简化为一个显示问题的最小示例吗?

Stack Overflow提供了有关如何创建最小,完整和可验证示例的指南

抱歉,我现在没有太多时间。

@mroderick我今天刚遇到这个问题。 这是一个复制该问题的小型存储库:这里

该错误需要同时显示webpackjsdom 。 栈跟踪和一些调试显示该问题出现时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 ,请发布问题报告。 此问题已解决。

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

相关问题

kbirger picture kbirger  ·  3评论

ndhoule picture ndhoule  ·  4评论

NathanHazout picture NathanHazout  ·  3评论

OscarF picture OscarF  ·  4评论

akdor1154 picture akdor1154  ·  4评论