【问题标题】:Backbone & Jasmine spies: spying on a specific model trigger callBackbone & Jasmine 间谍:监视特定模型触发调用
【发布时间】:2013-11-06 13:59:05
【问题描述】:

我正在尝试编写一个 jasmine 间谍来侦听骨干模型事件触发器。间谍在某种程度上起作用:它监视每个model.trigger 呼叫。有没有办法让它只查找 特定的 调用?

例如,如果我想监视 @trigger 'error',而不是 @trigger 'change',我可以这样做吗?在我下面的模型中,@set 调用还会触发 Backbone change 事件,该事件触发我的触发器间谍并导致测试失败。

主干模型定义:

class @AdminDatasetModel extends Backbone.Model
  toggleEnabled: ->
    @set 'enabled', !@get('enabled')
    $.ajax
      url: "#{@urlRoot}/#{@get('id')}/enable"
      type: 'POST'
      data: 
        enabled: @get 'enabled'
      success: (data) =>
        PDLS.vent.trigger 'admin:itemToggled', @
      error: (jqXHR) =>
        @trigger 'error', 'There was a problem updating your dataset!'

茉莉花规格定义:

describe 'An admin dataset model', ->
    MOCK_GET_DATA =
        id: 1
        name: 'someName'
        enabled: true
        permissions:
            userId: 2

    MOCK_SUCCESS_DATA =
        succes: true

    MOCK_ERROR_DATA =
        error: true

    dataset = null

    beforeEach ->
        PDLS = new PDLSApp
        # Always return true for ajax requests, unless we specify otherwise
        spyOn($, 'ajax').andCallFake (params) ->
            params.success = MOCK_SUCCESS_DATA

        @triggerSpy = spyOn AdminDatasetModel.prototype, 'trigger'

        it 'should bubble up an error when appropriate', ->
            $.ajax.isSpy = false
            spyOn($, 'ajax').andCallFake (params) ->
                params.error MOCK_ERROR_DATA

            toggleSpy = spyOn AdminDatasetModel.prototype, 'toggleEnabled'
            dataset = new AdminDatasetModel(MOCK_GET_DATA)
            dataset.toggleEnabled()

            expect(toggleSpy).toHaveBeenCalled()
            expect(@triggerSpy).toHaveBeenCalledWith 'error', 'There was a problem updating your dataset!'

【问题讨论】:

  • 是的——我只关心错误事件,不关心触发器是否被调用。

标签: javascript jquery backbone.js jasmine


【解决方案1】:

我通常喜欢做这样的事情:

listener = jasmine.createSpy 'listener'
model = new AdminDatasetModel(MOCK_GET_DATA)
model.on 'error', listener
model.toggleEnabled()
expect(listener).toHaveBeenCalledWith 'There was a problem updating your dataset!'

而不是直接监视trigger

【讨论】:

    猜你喜欢
    • 2014-01-25
    • 2023-03-20
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多