3

モデルがイベントをトリガーしたときにビュー メソッドが呼び出されることをテストしようとしています。しかし、これは機能していません。なぜこれが機能するのか、アイデアが尽きてしまいました。動作しないコードは次のとおりです。

意見:

class View extends Backbone.View
  initialize: ->
    @.listenTo @model, 'request', @disableForm, @

  disableForm: ->
    console.log 'disableForm'

ジャスミンテスト:

describe "AJAX events", ->

  it "when starting an AJAX request, disable the form", ->
    model = new Backbone.Model()
    view = new Backbone.View( { model: model })
    view.render()

    spyOn(view, 'disableForm')
    view.delegateEvents()

    model.trigger 'request'
    expect(view.disableForm).toHaveBeenCalled()

このコードはブラウザで正常に動作します。

また、テストを実行すると console.log に 'disableForm' が出力されるため、モデル イベントが disableForm の呼び出しをトリガーしていますが、私のスパイはこれを検出していません (私の期待は失敗します)。私はそれをwaitsForメソッドに入れてみましたが、彼も違いはありませんでした.

私が間違っているアイデアはありますか?

4

3 に答える 3

0

上記の回答は、これが発生している理由を正しく明確にしています。関数は初期化時にバインドされ、バインド後にスパイが関数を置き換えるため、イベントがトリガーされたときに元の関数が呼び出されます。

テストのセットアップ時 (初期化前) にプロトタイプの関数を置き換えるよりも面倒でない解決策は、無名関数をイベントにバインドし、その中でビューの関数を呼び出すことです。

@listenTo(model, event, => @viewFunction())

ただし、パフォーマンスのトレードオフが何であるかはわかりません。

于 2015-11-27T15:52:13.210 に答える