【问题标题】:unit test Backbone model save handle单元测试主干模型保存句柄
【发布时间】:2017-05-23 09:41:24
【问题描述】:

我对@9​​87654321@ 方法有一个看法。如何编写单元测试来检查以下代码中是否触发了事件

submit:(event) ->
    MyModel.save(null, {
        success: (model, response)=>
            @trigger('saveSuccess', response)
    })

注意:我不想检查是否调用成功

尝试:

it 'Should trigger events on save', (done) ->
    originalSave = MyModel.save
    triggerSpy = sinon.spy()
    MyModel.on('rating:saveSuccess', triggerSpy)
    stub = sinon.stub(MyModel, "save", ->
        successSpy = sinon.spy(arguments[1].success)
        originalSave.apply(MyModel, arguments);
        # want to call this line in the successSpy callback
        expect(triggerSpy.callCount).to.equal(1);
        done()
    )
    MyView.submit({})   
    expect(stub).to.have.been.called 

编辑 第二次尝试(成功但不确定其正确方式)

it 'Should trigger events on save', (done) ->
    triggerSpy = sinon.spy()
    MyView.on('saveSuccess', triggerSpy)
    stub = sinon.stub(MyModel, "save", ->
        arguments[1].success()
        expect(triggerSpy.callCount).to.equal(1);
        done()
    )
    MyView.submitReval({})  
    expect(stub).to.have.been.called

【问题讨论】:

    标签: unit-testing backbone.js coffeescript sinon chai


    【解决方案1】:

    进行单元测试时,需要对所涉及的单元做出决定。测试开始和结束的时间/地点。您可能会决定重要的是代码覆盖率,这将由 Istanbul 之类的工具计算得出。

    您的第一个示例将运行Model.save 代码,并且立即断言事件已被触发。这意味着您将拥有此功能的 100% 覆盖率。但请记住,Model.save 已运行,您可能不想覆盖模型。这可能不起作用,因为save 操作不是同步的,因此断言在代码完成之前运行。如果你还没有使用 sinon 的fakeServer,那么你应该考虑一下。

    您的第二个示例存根 Model.save 并且从不运行它。这将为您提供 1 行代码覆盖率(50%),但考虑到此处理程序只有一行,您需要通过这种方式询问此测试是否有任何价值。

    如果你是一个单元测试纯粹主义者,并且希望这个单元测试只增加被测函数的覆盖率,那么以下方法会起作用:

    it 'Should trigger events on save', ->
        triggerSpy = sinon.spy()
        MyModel.on('saveSuccess', triggerSpy)
        stub = sinon.stub(MyModel, "save", (attr, opts) ->
            opts.success.apply(null, [this, {}])
        )
        MyView.submit({})   
        expect(stub).to.have.been.called
        expect(triggerSpy.callCount).to.equal(1)
        expect(triggerSpy.args[0][0]).to.deep.equal({})
    

    这提供了 100% 的函数覆盖率(仍然只有 2 行,但这就是函数)。现在是同步的,Model.save 没有被调用,而是被存根。它断言函数的最终输出,触发事件。它还测试保存的响应是否包含在事件中。

    如果你不是一个纯粹主义者,那就看看 sinon 的fakeServer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 2018-08-05
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 2013-04-30
      • 2014-07-27
      相关资源
      最近更新 更多