单元测试事件驱动的JavaScript

7

我正在使用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)
            )
        );
    },
    ...
}
...

(emit将触发事件)

[编辑]

我开始阅读https://github.com/ry/node/tree/master/test/simple上的一些EventEmitter测试,这有助于我了解如何处理这个问题。


你看过这篇博客文章了吗?http://debuggable.com/posts/unit-testing-with-node-js:4b647d40-34e4-435a-a880-3b04cbdd56cb - Tmdean
是的,我读了这篇博客,它很有帮助,但只涵盖了一些要点。我刚刚注意到测试实际上不会退出直到循环完成。这仍然留下了一个简单的一次setTimeout和一次事件的问题。 - Raynos
我现在才注意到退出块是针对测试而不是服务器的。这是一种在所有异步操作完成后运行代码块的方法。 - Raynos
2个回答

4

就我个人而言,对我最有帮助的是阅读 node.js 的测试本身(我只阅读了其中约一半)。

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

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


3
我建议您查看Jasmine来进行测试。它是为在浏览器环境之外运行测试而构建的,并且可以存根调用,例如setTimeout,为您提供一个虚假的时钟,使您可以随意向前移动时间以测试任何与时间相关的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接