Javascript 单元测试nodejs事件

Javascript 单元测试nodejs事件,javascript,node.js,unit-testing,events,mocha.js,Javascript,Node.js,Unit Testing,Events,Mocha.js,我正在使用中介绍的解决方案对节点应用程序中的事件进行单元测试 但是,setTimeout函数从不调用,因此我的测试在失败时通过 以下是一个例子: suite('myTests', function() { test('myFunction_whenCalled_emitsEvent', function() { var myClass = new MyClass(); var eventTimeout = setTimeout(function()

我正在使用中介绍的解决方案对节点应用程序中的事件进行单元测试

但是,setTimeout函数从不调用,因此我的测试在失败时通过

以下是一个例子:

suite('myTests', function() {
    test('myFunction_whenCalled_emitsEvent', function() {
        var myClass = new MyClass();
            var eventTimeout = setTimeout(function() {
                assert(false);
            }, 1000);
            myClass.on('something', function() {
                clearTimeout(eventTimeout);
            });
            myClass.doSomething(); // this does not emit the 'something' event
    });
});
我预计这会失败,只要“某物”事件没有引发,1秒后就会失败

我在
assert(false)
行中放置了一个断点,它从未被命中


有人能给我指出正确的方向吗?谢谢

您必须使用
done
回调来显示您的测试已完成。大概是这样的:

suite('myTests', function() {
    test('myFunction_whenCalled_emitsEvent', function(done) {
        var myClass = new MyClass();
        myClass.on('something', function() {
            done();
        });
        myClass.doSomething();
    });
});
看起来您只是在测试事件是否已发出。如果是这种情况,那么整个
setTimeout
过程就没有必要了。如果没有默认的超时时间(2000毫秒,如果我没记错的话),摩卡咖啡本身就会超时


按照代码设置的方式,Mocha只需安排活动,然后退出测试。由于活动安排成功,摩卡将称测试成功。

你好,路易斯。谢谢你的回答。我更改了代码,don()调用没有按预期命中,但是测试仍然通过。看起来所有测试都会在大约12毫秒后运行并退出。我需要做些什么来确保它在退出之前检查done()?再次感谢你。事实上,我认为问题出在其他方面。如果测试通过了我在答案中的代码,那么这意味着调用了
done()
,因为如果在超时时间内没有调用
done()
,摩卡会抱怨。现在,如果在其他地方(在你的应用程序或你正在使用的库中)存在
setTimeout
,那么这可能会延迟Mocha的退出。如果我在测试之前运行的测试使用setTimeout,而没有调用done,这会导致这个问题吗?可能,但从这里很难判断。您可以做的一件事是将此测试隔离在一个单独的文件中,并在其上运行mocha,然后查看它的行为。如果它运行文件并且在退出之前没有延迟,那么您知道问题出在其他地方。感谢您对此的持续支持!我会在你的帮助下继续调查。