Titaniumの非同期なイベントのテスト

非同期なイベントというか、イベントは非同期なのでテストに工夫を要する。
以下はそれをCoffeeScriptとJasmineで書いたスペック。

ブックマークをテーブルビューに表示する画面のイベントに関するテストをJasmineのruns,waitsFor,waits等を駆使して書いている。

describe("BookmarkViewController", ->
    beforeEach(->
        @bvc = new BookmarkViewController(Ti.UI.createWindow())
        @item = {id:1, name:"HOGE"}
    )

    describe("編集ボタンをクリックした場合", ->
        beforeEach(->
            afterEventState = => @bvc.tableView.editing == true

            runs => @bvc.buttonEdit.fireEvent("click")
            waitsFor => afterEventState()
        )
        it("テーブルビューが編集モードになること", ->
            runs => expect(@bvc.tableView.editing).toBe true
        )
        it("テーブルビューが順番入れ換え可能になること", ->
            runs => expect(@bvc.tableView.moving).toBe true
        )
        it("編集完了ボタンがナビゲーションバー右側に表示されること", ->
            runs => expect(@bvc.window.rightNavButton).toEqual @bvc.buttonDone
        )
    )

    describe("テーブルの行をクリックした場合", ->
        it("詳細を表示すること", ->
            spyOn(@bvc, "openDetail")
            runs => @bvc.tableView.fireEvent("click", {row: {index:0, item:@item}})
            waits(100) # 微妙だが待つ方法がこれ以外思いつかない
            runs => expect(@bvc.openDetail).toHaveBeenCalledWith(@item)
        )
    )

    describe("編集完了ボタンをクリックした場合", ->
        beforeEach(->
            afterEventState = => @bvc.tableView.editing == false

            runs => @bvc.buttonDone.fireEvent("click")
            waitsFor => afterEventState()
        )

        it("通常モードに戻ること", ->
            runs => expect(@bvc.tableView.editing).toBe false
        )
        it("順番入れ替えできない状態に戻ること", ->
            runs => expect(@bvc.tableView.moving).toBe false
        )
        it("編集ボタンがナビゲーションバー右側に表示されること", ->
            runs => expect(@bvc.window.rightNavButton).toEqual @bvc.buttonEdit
        )
    )
)

fireEventした後イベントが非同期で動くので、イベントが終わるまで待たないといけない。
ボタンをクリックした場合はイベント後の状態を取ることができるので、waitsForでその状態になるまで待ってイベント終了を判断している。
テーブル行をクリックした場合は他の画面に遷移してしまうため状態が取れないので、waitsのタイマーで待っている。タイマーで待つのはかなり微妙だが、他に妙案もないし、とりあえず用を成すのでいいかと。

前の記事

とりあえずのGuard::Shell