【问题标题】:How can I test that a callback *doesn't* get run?如何测试回调 * 不会 * 运行?
【发布时间】:2014-06-23 12:42:42
【问题描述】:

我想测试特定函数在测试期间是否运行回调。例如,在我下面的简化代码中, 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(),但我认为 Mocha 中可能为此目的内置了一些东西。

我还可以在不应该发出警报时向 checker() 添加第二个回调,但这让我很震惊test-induced design damage,我想避免这种情况。

【问题讨论】:

  • 你不能用应该运行回调的数字来运行测试,以确认测试正常吗?
  • @Cerbrus 是的,我已经有一个单独的测试来提高警报。我认为发出警报而不是发出错误警报是需要测试的单独功能。例如,代码可以一直发出警报,并且仍然通过引发警报测试。
  • @isi 对不起,我不明白“你不能总是需要在异步通信中解决此类问题。”方法。回复:setTimeout() 我已经在我的问题中解决了这个问题。
  • @isi 我明白我想你想说什么(虽然你的英语很难理解)。在您回答的问题中查看我的观点:setTimeout()
  • 抱歉提高了混淆级别。我想说:我认为您需要使用超时来走路线,正如您在问题中已经提到的那样。或者,使用轮询机制。

标签: javascript node.js unit-testing mocha.js


【解决方案1】:

这种断言的最佳位置是processexit 事件,因为在那之后什么都不会发生(好吧,除了其他exit 听众,请记住这一点):

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)
})

不幸的是,这种模式不适用于 mocha。它将显示测试通过,然后在失败时显示堆栈跟踪。

【讨论】:

  • 谢谢,这正是我要找的。我暂时不确定该过程是否真的在每个测试中退出,但检查它,似乎确实如此。与使用 process.on('exit')setTimeout() 相比,意味着我有一个超时而不是两个。
  • setTimeout 的问题是回调仍然可以稍后调用。超时也会使进程保持活动状态,尽管它可能是唯一活跃的事情,并且没有机会调用回调
  • 你完全确定这行得通吗?即使是test 中的简单process.on('exit', function(){ done() }); 似乎也失败了。
  • 确实,这种模式不适用于 mocha。两个想法:mocha 使用超时进行异步测试,因此 exit 事件仅在超时失败后触发(超时 0 强制进程保持活动状态,可能通过 setInterval)。 mocha 也可能使用exit 事件来计算回调。我将添加一个解决方法
  • 完全忘记了:mocha 一个一个地运行异步测试,这就是为什么将done 放入exit 监听器没有意义
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 2019-06-16
  • 1970-01-01
  • 2012-10-13
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多