Javascript 如何测试回调*不*运行?

Javascript 如何测试回调*不*运行?,javascript,node.js,unit-testing,mocha.js,Javascript,Node.js,Unit Testing,Mocha.js,我想测试一个特定的函数在测试期间是否不运行回调。例如,在我下面的简化代码中,checker.check检查数字,并且在这个特定测试中给出的数字不应该运行回调 test('Do not raise false alerts', function(done){ var checker = setupChecker(function(){ done('bad alert') }) checker.check(60) checker.check(70)

我想测试一个特定的函数在测试期间是否不运行回调。例如,在我下面的简化代码中,checker.check检查数字,并且在这个特定测试中给出的数字不应该运行回调

test('Do not raise false alerts', function(done){
    var checker = setupChecker(function(){
        done('bad alert')
    })
    checker.check(60)
    checker.check(70)
    checker.check(80)
})
基本上,如果从未调用done,我希望测试超时

我当然可以使用setTimeout来实现这个目的,但我认为摩卡咖啡中可能内置了一些东西来实现这个目的


我还可以在checker中添加第二个回调,以确定何时不应发出警报,但这让我感到震惊,我希望避免这种情况

此类断言的最佳位置是进程的退出事件,因为在此之后不会发生任何事情,除了其他退出侦听器,请记住:

test('Do not raise false alerts', function(){
    var badAlert = false;
    var checker = setupChecker(function(){
        badAlert = true
    })

    process.on('exit', function () {
      assert.ok(!badAlert);
    });


    checker.check(60)
    checker.check(70)
    checker.check(80)
})

不幸的是,这种模式并不适合摩卡咖啡。它将显示测试通过,然后在失败的情况下显示堆栈跟踪。

您不能使用应该运行回调的数字运行测试,以确认测试是否正常吗?@Cerbrus是的,我已经有一个单独的测试用于发出警报。我认为提高警报和不提高假警报作为单独的功能,需要测试。例如,代码可以一直发出警报,但仍然通过了提升警报测试。@isi抱歉,我不明白什么是“你不能,你总是需要在异步通信中解决此类问题。”意思是。Re:setTimeout我在我的问题中已经提到了这一点。@isi我理解你想说的话,尽管你的英语很难理解。请参阅我的观点:在您回答的问题中设置超时。Sry以提高混淆级别。我想说的是:我想你需要使用一个超时,正如你在问题中已经提到的那样。或者,使用轮询机制。谢谢,这正是我想要的。我一时不确定这个过程是否真的在每个测试中都存在,但是检查它,它似乎确实存在。与使用进程的setTimeout相比,“退出”意味着我只有一个超时,而不是两个。setTimeout的问题是回调仍然可以在以后调用。此外,超时将使进程保持活动状态,尽管它可能是唯一活动的东西,并且回调不可能被调用。您是否完全确定这可以工作?即使是一个简单的过程。在'exit'上,函数{done};内部测试似乎失败了。事实上,这种模式不适合摩卡咖啡。两个想法:mocha对异步测试使用超时,因此只有在超时失败超时0强制进程保持活动状态(可能是通过setInterval)后才会触发退出事件。另外,mocha可能使用exit事件来计算回调次数。我将添加一个解决方案:mocha一个接一个地运行异步测试,这就是为什么将done放在exit listener中毫无意义