HTML をページにロードし、DOM 要素とイベント リスナーをアタッチし、変数loaded
を true に設定する関数があります (テスト目的で)。これはすべて親関数にラップされているため、引数を渡して名前空間を制御できます。テストする必要がある関数は、戻りオブジェクトで公開されます。
((win) ->
win.PanelLoader = (args) ->
loaded = false
el =
container: $(".container")
showPanel = ->
$.get "panel.html", (data) ->
el.container.append(data)
attachDOMElements()
loaded = true
attachDOMElements = ->
el.panel = $(".panel")
panelHasBeenLoaded = ->
loaded
showPanel()
return {} =
el: el
showPanel: showPanel
) this
panelHasBeenLoaded() は、AJAX リクエストが成功するまで単に false を返します。次に、スペックファイルに次のものがあります。
it "should confirm when the panel is loaded", ->
panelLoader = PanelLoader()
expect(panelLoader.el.panel).toBe(undefined)
waitsFor (->
panelLoader.panelHasBeenLoaded()
), "It took too long to load in the panel", 3000
runs ->
expect(panelLoader.el.panel.length).toBeGreaterThan(0)
PanelLoader を初期化し、「panel」DOM 要素がないことを確認していると想定しています。その後、waitsFor
「panelHasBeenLoaded()」が true を返すまでブロックし、3 秒後にタイムアウトします (十分な時間があるはずで、localhost から実行されます)。次に、DOM 要素がそこにあることを期待して、テストを実行します。
私が抱えている問題は、常にタイムアウトしているため、2 番目の期待テストが失敗することです。ブラウザでテストするとすべて機能するのに、単体テストが機能しないのはなぜですか?
grunt-contrib-jasmine ランナーを介して、テストにジャスミンとファントム JS を使用しています。
ありがとう