【问题标题】:Unit testing event driven javascript单元测试事件驱动的javascript
【发布时间】:2011-05-23 17:30:35
【问题描述】:

我正在使用 node.js 编写一个服务器端应用程序,并希望包含单元测试。我正在努力解决的一件事是对EventEmittersetInterval/setTimout 进行单元测试的好方法

我有哪些选项可以对异步服务器端 javascript 进行单元测试?

我知道我可以将另一个侦听器附加到作为测试功能的 EventEmitter,但是我如何保证测试功能曾经运行过?单元测试的一部分是确保单元测试的每个部分都运行。

我可以自己使用 setTimeout ,但这似乎是一个不合时宜的解决方案。

如果有帮助,这里是我正在尝试测试的一些示例代码。

...
function init(param) {
    ...
    // run update entities periodically
    setInterval(this._updateEntities.bind(this, param.containerFull),
        1000 / param.fps);
    ...
}
...
EntityUpdater.prototype = {
    ...
    "_updateEntities": function updateEntitiesfunc(fn) {
        this._tickEmitter.emit(
            "tick",
            new dataContainer.DataContainer(this.getEntityCount())
            .on(
                "full", fn.bind(this)
            )
        );
    },
    ...
}
...

(发射会触发事件)

[编辑]

我开始阅读 https://github.com/ry/node/tree/master/test/simple 上的一些 EvevntEmitter 测试,它帮助我了解如何去做。

【问题讨论】:

  • 你看过这篇博文了吗? debuggable.com/posts/…
  • 是的,我阅读了该博客,它很有帮助,但只涵盖了几点。我只是注意到在循环完成之前测试不会真正退出。这仍然留下了一个简单的一次性 setTimeout 和一次性事件。
  • 我现在才注意到退出块是关于测试而不是服务器。它是一种在所有异步操作完成后运行代码块的方法

标签: javascript unit-testing events asynchronous node.js


【解决方案1】:

我建议您查看Jasmine 进行测试。它是为在浏览器环境之外运行测试而构建的,它会存根诸如setTimeout 之类的调用,为您提供一个假时钟,您可以利用它在闲暇时将时间向前移动,以测试任何与时间相关的内容。

【讨论】:

    【解决方案2】:

    对我个人帮助最大的是阅读 node.js 本身的测试(我只阅读了大约一半)。

    这让我很好地了解了如何测试异步代码。

    感谢 @tmdean 指出如何测试异步代码的另一个示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2011-11-24
      • 1970-01-01
      • 2019-10-09
      相关资源
      最近更新 更多