2

[実行] を数回クリックします。これらのテストは成功と失敗を交互に繰り返します。

http://jsfiddle.net/samselikoff/hhk6u/3/

どちらのテストでも が必要ですcompaniesが、イベントを分離する方法がわかりません。何か案は?

答え:

ジェファーソンは正しいです。これを解決する簡単な方法の 1 つは、events.once代わりに を使用することですevents.on。このようにして、各テストからイベントをクリーンアップします。

4

2 に答える 2

2

トリガーされたイベントのコールバックが非同期である間に、同期テストを実行しています。

これを修正するには、「asyncTest」を実装し、テスト アサーションを収集する準備が整ったときに start 関数を呼び出す必要があります。

2 番目のテストは次のメッセージで失敗していました。

すでに開始されている間に start() が呼び出されました (QUnit.config.semaphore はすでに 0 でした)

teste 同期テストだったので、すでに開始されていて、再度 start() メソッドを呼び出していたからです。

また、コールバック関数を指定しない最初のテストでは、シミュレートされた AJAX 呼び出しの準備ができたときに start() を呼び出すことができるように、非同期呼び出しを別の関数でラップする必要があります。

私はあなたの JSFiddle を作業コードで更新しました: http://jsfiddle.net/hhk6u/8/ 新しいコードは:

QUnit.config.autostart = false;
QUnit.config.testTimeOut = 1000;

asyncTest('Some test that needs companies.', function() {
    function getCompanies() {
        var companies = new Companies();
        ok(1);
        start();
    }
    setTimeout(getCompanies, 500);
});

asyncTest('Some other async test that triggers a listener in companies.', function() {   
    var companies = new Companies();

    events.trigger("userSet:company", { name: "Acme", id: 1 });

    stop();
    events.on('fetched:departments', function(response) {
        console.log(response);
        deepEqual(response, [1, 2, 3]);
        start();
    });
});

最初のテスト メソッドでは、AJAX 呼び出しが終了するのに十分な間隔 (500 ミリ秒) の後に呼び出される "getCompanies" 関数を作成したことに注意してください。

必要に応じてこの時間を調整する必要があります。また、「testTimeOut」の値を調整して、メソッドが無期限に実行されないようにする必要があります。

詳細については、QUnit 構成ドキュメントを参照してください: http://api.qunitjs.com/QUnit.config/

于 2013-05-21T10:32:40.663 に答える
1

各テストの開始時に (setup() メソッドで) イベント バスを作成していないため、最初の Fiddle が失敗する可能性はありませんか? 2 番目のテストでそれを 2 回処理し、start() を 2 回呼び出します。

更新された Fiddle http://jsfiddle.net/e67Zh/を参照してください。毎回イベント バスが作成されます。

イベントが発生しないシナリオでは、qunit テストでタイムアウトを設定することもできます。

/* Backbone code
*******************/
var Company = Backbone.Model.extend({});

var Companies = Backbone.Collection.extend({

    initialize: function() {
        var self = this;

        events.on("userSet:company", function(company) {
            self.selectedCompany = company;

            // Simulate an AJAX request
            setTimeout(function() {
                events.trigger("fetched:departments", [1, 2, 3]);
            }, 500);
        });
    },

    selectedCompany: ''
});


/* Tests
*******************/

module("test with new event bus each time", {
    setup: function() {
        events = _.clone(Backbone.Events);
    }
});

test('Some test that needs companies.', function() {
    var companies = new Companies();
    ok(1);
});

test('Some other async test that triggers a listener in companies.', function() {   
    var companies = new Companies();

    events.trigger("userSet:company", { name: "Acme", id: 1 });

    stop();
    events.on('fetched:departments', function(response) {
        console.log(response);
        deepEqual(response, [1, 2, 3]);
        start();
    });
});
于 2013-06-07T10:11:55.233 に答える