1

次のバックボーン ビューでクリック イベント ハンドラーを指定しようとしています。

class ItemView extends Backbone.View
  events:
    "click": "addToCurrentlyFocusedList"

  addToCurrentlyFocusedList: (e) =>
    window.currentlyFocusedList.add @model

これは私が持っているものです:

describe "ItemView", ->
  beforeEach ->
    @item = new Backbone.Model
      id: 1
      name: "Item 1"
    @view = new ItemView model: @item

  describe "when clicked", ->
    it "adds the item to the currently focused list", ->
      window.currentlyFocusedList = sinon.stub()
      window.currentlyFocusedList.add = sinon.stub()
      @view.$el.trigger "click"
      expect(window.currentlyFocusedList.add).toHaveBeenCalledWith @item

これは機能しますが、何らかの理由で気になります。実装をテストしているように感じすぎるかもしれません。

考えられる改善の 1 つは、クリック イベント ハンドラー、仕様、およびcurrentlyFocusedListを という新しいビューに移動することAppViewです。

describe "AppView", ->
  beforeEach ->
    @view = new AppView

  it "adds a clicked item to the currently focused list", ->
    $clickedItem = @view.$(".item:first")
    $clickedItem.trigger "click"
    expect(@view.currentlyFocusedList.pluck('id')).toInclude $clickedItem.attr('data-id')

これでwindow汚れも落ちていいですね。また、アイテムが実際にコレクションに追加されていることもテストします。それはさておき、イベント ハンドラーと仕様をAppView私の最初のアプローチよりも優れたものに移行していますか? これについてもっと良い方法はありますか?

4

1 に答える 1

1

window.currentlyFocusedList をダミーの Collection でスタブ化し、そこに追加されたことをテストします。これらの行に沿ったもの:

beforeEach ->
  @collection = new Backbone.Collection()
  spyOn(window, 'currentlyFocusedList').andReturn @collection

it "adds the item to the collection", ->
  @view.$el.click()
  expect(@collection).toInclude @item

これは、コードが実際に行うことをテストします。コレクションにアイテムを追加するとビューにどのように影響するかのコードは別の場所にあるため、別の場所でテストする必要があります。

于 2012-04-10T01:40:00.247 に答える