[英]When testing NodeJS code with Mocha and Chai assertions, how can I expect an exception to be thrown from a callback?
我正在使用Mocha和Chai期望断言来测试我的NodeJS应用程序。 我可以写一个这样的测试,它工作得很好:
describe 'My Code', ->
it 'should handle exceptions', (done) ->
fn = ->
# Do something that causes an error
throw new Error()
expect(fn).to.throw(Error)
done()
但是如果fn
必须首先调用一个接受回调的函数,并且可能根据结果抛出错误呢? 例如,如果它命中数据库并可能根据结果抛出异常? 这不起作用:
describe 'My Callback-using Code', ->
it 'should handle exceptions thrown from callbacks', ->
doSomethingAsync = (callback) ->
setTimeout (->
callback(somecalculatedvalue)
), 1000
fn = ->
doSomethingAsync (value) ->
# The value meets a condition so throw an error
throw new Error()
expect(fn).to.throw(Error)
done()
调用完成后测试结束,但尚未抛出异常,因此测试失败。 我怎样才能通过测试?
编辑:根据彼得的回答,这不是正确的方法。 可以用类似以下的方式更好地表达:
describe 'My Error Handling Code', ->
it 'should handle errors', ->
fn = (callback) ->
getValueFromDatabase (value) ->
if value.isBad()
callback({ error: 'The value is bad.'})
else
callback()
fn (e) ->
expect(e).to.exist()
done()
谢谢大家的帮助! 这将有助于我正在做的很多事情。
这是您自己的代码还是您正在使用的库? 在异步操作之后抛出异常是节点中的禁止。 您必须将错误作为第一个参数传递给回调函数。 堆栈已被重置,因此无法捕获抛出的异常。 抛出异常仅适用于同步代码,因此您几乎在节点代码中几乎看不到它,因为异步代码会不断启动新堆栈,而不会调用可用于捕获异常的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.