【问题标题】:Writing unit test to check that event was triggered编写单元测试来检查事件是否被触发
【发布时间】:2013-09-18 07:20:01
【问题描述】:

我想知道正确的方法是什么。首先是测试代码。

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 秒后失败。但是没有验证,它只被触发了一次。也许我需要另一个测试?因为我已经知道它至少被触发了一次,所以我可以在这个之后使用 test 和 spy 。虽然对于一个事件来说似乎太麻烦了。

另一种“肮脏”的方法可能是这样的:

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

它可能不是真正的防弹。可能需要更大的超时时间才能确定。然而,这意味着测试将需要更长的时间来处理,这不是一个好主意。

你有什么其他的想法应该如何解决?

【问题讨论】:

    标签: unit-testing events asynchronous mocha.js chai


    【解决方案1】:

    我认为你的第三个选择是正确的:

    describe 'Something', ->
        it 'should be triggering even', (done) ->
            instance = new Something()
            instance.on("itsdone", done)
            instance.methodCall()
    

    如果我理解正确,您担心的是这并不能测试回调没有被调用两次。

    一般来说,很难测试事情不会发生。例如,你要等多久才能看到它是否不会被第二次调用? 2 秒? 2小时?您确实需要使用对被测试代码的理解来了解需要进行哪些测试。单元测试不应该是完整的黑盒测试。

    除非我知道底层代码可能会以导致它被调用两次的方式中断,否则我不会测试它是否被调用两次。

    【讨论】:

    • 好的,谢谢您的确认。我也认为它是最好的解决方案。之后我放弃了事件并使用了 Promises/A :)
    猜你喜欢
    • 1970-01-01
    • 2014-04-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    相关资源
    最近更新 更多