问题标签 [usefaketimers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
141 浏览

jestjs - 使用 jest.useFakeTimers 时如何断言回调

我试图了解如何正确地对我们拥有的自定义去抖动方法进行单元测试:

这是失败的 Jest 单元测试:

失败:

我也在这里尝试过解决方案:https ://stackoverflow.com/a/52638566/704681没有成功

解决方法:到目前为止我能够测试它的唯一方法:

0 投票
1 回答
62 浏览

c++ - 为什么 faketime 命令会跳过代码段

我有一个 cpp 代码,我正在尝试使用 faketime 命令运行。我在两台相同的计算机上运行它。他们都在运行 RHEL 7。我注意到,当我在一台计算机上运行我的代码时,它完全跳过了我的 popen 调用。

我的代码本质上是

我添加了一个打印声明

但是当我使用“faketime 'last friday 5pm' ./code”运行它时,在一台计算机上由于某种原因它永远不会到达打印语句,而在另一台计算机上它确实如此。我在网上搜索没有成功(我没有运行近似算法,它们具有相同的编译器和生成文件等。我实际上是在对代码进行 git pull 并运行它)。

有谁知道为什么?

谢谢

0 投票
0 回答
40 浏览

reactjs - 使用带有 react 的 sinon 假计时器以使用 useEffect 强制帧上的特定时间

我正在尝试将 SinonFakeTimers与一个名为remotion渲染动画组件视频的库一起使用。我正在使用framer-motion它使用基于时间的持续时间值来制作动画。它使用performanceAPI 来保持一切同步。

这在浏览器环境中效果很好,但是由于我要渲染,所以我的帧渲染时间不是实时的。我想伪造时间,以便framer-motion认为已经过去了一帧的时间。

FakeTimers 与 一起工作shouldAdvanceTime: true,所以我猜下面的解决方案应该可以工作。

这就是我正在尝试的,但帧渲染永远不会继续。我猜可能会有一些干扰以某种方式阻止反应渲染,但我无法弄清楚。该clock.tick功能似乎不起作用。

0 投票
0 回答
88 浏览

reactjs - 使用 Jest 和 Enzyme 进行测试未正确安装

我正在尝试使用 Enzyme 渲染我的 React 项目,但它没有正确安装并且它的状态没有更新。骰子数组应该成为 1 到 6 之间的随机数字数组。

我使用jest.useFakeTimers()正确吗?

游戏.js

游戏.jest.js

0 投票
0 回答
28 浏览

reactjs - 如何让 jest 假计时器与 jest/react 中的异步函数一起工作?

该测试应该做的是确保“出现问题”的消息在 5 秒后消失。但是,它不起作用。我相信这是因为我在异步函数中使用了假计时器,但不知道如何解决这个问题。

这就是这个功能的实现方式。任何帮助将不胜感激。

0 投票
0 回答
41 浏览

javascript - Sinon 假计时器和与不可预测的计时器同步滴答以保证执行顺序

我正在使用 Sinon 假定时器来测试一些包含定时器的功能。问题是被测试的函数在调用定时器之前使用了几个异步调用,我发现很难同步测试用例,以便clock.tickAsync()保证在被测试的函数调用之后setTimeout()被调用。我见过其他类似问题的问题,但它们更多的是关于从测试中设置的计时器以及如何将它们与也从测试中调用的滴答声同步。但是如果我们认为我们的函数 other test 是一个黑盒子,并且我们所知道的是在执行一些异步调用之后,它会调用setTimeout,我们必须提前时钟以防止计时器挂起,这将是一个好方法?

示例:这里,foo是我们要测试的功能。我们所知道的是它执行一些异步任务,无论是 I/O 还是其他什么,然后等待 10 秒(我的真实代码实际上有一个循环,其中每秒检查一个条件,超时 10 秒)。测试调用foo然后将时钟提前 20 秒以触发计时器,但大多数情况下它不会工作,因为调用tickAsync()will be before foo已经调用setTimeout()

所以,这个测试通常会失败,因为计时器永远不会被触发。

我意识到最可靠的方法可能是如果我的测试可以在setTimeout被调用时得到通知,所以我考虑添加一个事件发射器来发送“等待”事件,但这确实使我的生产代码混乱。我还考虑过给猴子打补丁 setTimeout(在 Sinon 替换它之后)也发出一个事件。但这也很混乱。最后,我采取了一个tickAsync()调用循环,确保每个调用await clock.tickAsync()都给事件循环一个新的运行,这有效,但本质上当然是不可靠的,因为它仍然依赖于任意选择的循环数量等:

例如,这适用于tickSteps(clock, 20000, 100)但可能不适用于 的steps50,并且显然不是一个稳健的解决方案。

我还考虑在我的测试代码中添加一个“真实”计时器,让它在打假时钟之前实际等待 50“真实”毫秒,但这也被证明是混乱的。

除了重新设计我的代码以将其分解成更小的部分或添加回调/事件之外,Sinon 本身有什么办法可以帮助解决这个问题吗?本质上,我需要告诉Sinon 计时,但将其推迟到下一个设置的计时器(但我想如果运行时使用计时器等也可能有问题)。或者,如果有办法“勾选假时钟,但只有在真正的时钟延迟之后”。

是否有针对此问题的首选解决方案,或者我应该放弃并重新设计我测试过的代码?