次のバックボーン ビューでクリック イベント ハンドラーを指定しようとしています。
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
私の最初のアプローチよりも優れたものに移行していますか? これについてもっと良い方法はありますか?