[実行] を数回クリックします。これらのテストは成功と失敗を交互に繰り返します。
http://jsfiddle.net/samselikoff/hhk6u/3/
どちらのテストでも が必要ですcompanies
が、イベントを分離する方法がわかりません。何か案は?
答え:
ジェファーソンは正しいです。これを解決する簡単な方法の 1 つは、events.once
代わりに を使用することですevents.on
。このようにして、各テストからイベントをクリーンアップします。
[実行] を数回クリックします。これらのテストは成功と失敗を交互に繰り返します。
http://jsfiddle.net/samselikoff/hhk6u/3/
どちらのテストでも が必要ですcompanies
が、イベントを分離する方法がわかりません。何か案は?
答え:
ジェファーソンは正しいです。これを解決する簡単な方法の 1 つは、events.once
代わりに を使用することですevents.on
。このようにして、各テストからイベントをクリーンアップします。
トリガーされたイベントのコールバックが非同期である間に、同期テストを実行しています。
これを修正するには、「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/
各テストの開始時に (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();
});
});