【发布时间】:2016-01-18 19:49:33
【问题描述】:
我有一个函数:
var inRendering = false;
function render() {
if (inRendering) {
requestAnimationFrame(render);
} else {
inRendering = true;
requestAnimationFrame(function () {
longAction();
inRendering = false;
});
}
}
我必须对它进行单元测试。测试render并发调用的情况。
请帮帮我好吗?在 JavaScript 中这样的并发调用是可能的吗?谢谢。
附:我写了一个显然不起作用的测试(见评论):https://gist.github.com/kuraga/b0aa3d66fc0620f03b11
【问题讨论】:
-
你需要写一个异步测试。
-
@SLaks 到底是什么意思?我的测试尝试是异步的(但没有 WebWorkers)
-
您并没有真正尝试测试同一函数的并发调用。 JS 是单线程的,因此您可以对同一个函数进行递归调用,但除了递归调用之外,函数的第一次调用将在另一个函数开始之前完成。您想测试是否在调用第一次调用 render 的内部函数之前再次调用外部函数 (render)。要对此进行测试,您将模拟 requestAnimationFrame 以便您可以在测试期间对其进行控制。
-
另外,你有一个错误......你想要 inRendering = true; requestAnimationFrame(function () { ... inRendering = false; });您需要在调用 requestAnimationFrame 而不是从 rAF 调用时发出已请求渲染的信号。
-
@neonstalwart 是的,你说得对。非常感谢!您是否建议完全模拟
requestAnimationFrame(不调用真实的requestAnimationFrame)?附:我知道“IO 操作和异常”可能会导致下一个动画帧(在函数完成之前),但我不知道如何在这里准确地使用它......
标签: javascript node.js unit-testing concurrency