我想知道正确的方法。首先这是测试代码。
这样测试显然会失败。然后我想到了这样的做法...
这个测试用例目前能够正确运行,如果事件没有触发,则在2秒后测试将失败。然而,并没有验证它是否只触发了一次。也许我需要另一个测试来验证这一点?既然我已经知道它至少触发了一次,那么可能会在这之后使用带有间谍的测试。虽然似乎为了一个事件而麻烦太多。
另一个“非常规”的方法可能是这样:
describe 'Something', ->
it 'should trigger event', (done) ->
spy = sinon.spy()
instance = new Something()
instance.on("itsdone", spy)
instance.methodCall()
spy.should.have.been.calledOnce
done()
看起来很简单,但由于事件通常是异步的,所以这样做行不通。
class Something
constructor: ->
@events = {}
on: (event, cb) ->
@events[event] = new signals.Signal() unless @events[event]?
@events[event].add cb
methodCall: ->
# Fire up `itsdone` event when everything else is done
setTimeout (=> @events['itsdone']?.dispatch()), 0
这样测试显然会失败。然后我想到了这样的做法...
describe 'Something', ->
it 'should be triggering even', (done) ->
instance = new Something()
instance.on("itsdone", done)
instance.methodCall()
这个测试用例目前能够正确运行,如果事件没有触发,则在2秒后测试将失败。然而,并没有验证它是否只触发了一次。也许我需要另一个测试来验证这一点?既然我已经知道它至少触发了一次,那么可能会在这之后使用带有间谍的测试。虽然似乎为了一个事件而麻烦太多。
另一个“非常规”的方法可能是这样:
describe 'Something', ->
it 'should be triggering even', (done) ->
spy = sinon.spy()
instance = new Something()
instance.on("itsdone", spy)
instance.methodCall()
setTimeout ->
spy.should.have.been.calledOnce
done()
, 0
这可能并不是绝对可靠的解决方案。为了确保其有效性,可能需要更长的超时时间。然而这意味着测试需要更长的处理时间,这并不是一个好主意。
你有什么其他的想法来解决这个问题吗?