0

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 を使用しています。

ありがとう

4

1 に答える 1

0

コードの問題は、JasmineがブロックwaitsFor()にしか適用されないことです。runs()例えば、

runs(function() {
        asyncMethod();
        console.log('an asynchronous method');
    }, 'an asynchronous method');

    waitsFor(function() {
        return x == 1;
    }, 'x to be equal to 1', 6000);

    console.log('this executes between two runs()');

    runs(function() {
        console.log('another sequential block');
    }, 'another sequential block');

は、 まで 2 番目runs()が実行されないことを意味しますwaitsFor()が、console.log()にネストされていない はruns()待機せずに実行されます。コードにruns()beforeが表示されないため、おそらく何もしません。waitsFor()waitsFor()

于 2013-10-07T08:59:24.263 に答える