【问题标题】:Test concurrent call of the same function测试同一个函数的并发调用
【发布时间】: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


【解决方案1】:

您可以使用异步模块,特别是 async.parallel 以并行运行两个函数

例如:

async.parallel([
    function(callback){
        // run your function once
    },
    function(callback){
        // run your function the second time
    }
],
// optional callback
function(err, results){
    // the results array will equal ['one','two'] even though
    // the second function had a shorter timeout.
});

【讨论】:

  • 非常感谢!但是“注意:如果您的任务不使用任何计时器或执行任何 I/O,它们实际上将被串行执行。”所以,这是另一个问题,也许和我的尝试一样。我会在一天内尝试。谢谢,@nir-levy
猜你喜欢
  • 2019-04-02
  • 1970-01-01
  • 2016-11-16
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 2022-01-10
  • 1970-01-01
相关资源
最近更新 更多