单击运行几次 - 这些测试在通过和失败之间交替。
http://jsfiddle.net/samselikoff/hhk6u/3/
两个测试都需要companies
,但我不知道如何隔离事件。有任何想法吗?
回答:
杰斐逊是正确的。解决此问题的一种简单方法是使用events.once
而不是events.on
. 这样你就可以从每个测试中清理你的事件。
单击运行几次 - 这些测试在通过和失败之间交替。
http://jsfiddle.net/samselikoff/hhk6u/3/
两个测试都需要companies
,但我不知道如何隔离事件。有任何想法吗?
回答:
杰斐逊是正确的。解决此问题的一种简单方法是使用events.once
而不是events.on
. 这样你就可以从每个测试中清理你的事件。
您正在运行同步测试,而触发事件的回调是异步的。
要解决这个问题,您必须实现“asyncTest”并在准备好收集测试断言时调用 start 函数。
您的第二次测试失败并显示以下消息:
已启动时调用 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();
});
});
请注意,在第一个测试方法中,我创建了一个“getCompanies”函数,该函数将在一个足以让 AJAX 调用完成的间隔(500 毫秒)后被调用。
您必须根据需要调整此时间,并调整“testTimeOut”值,这样您的方法就不会无限期地运行。
有关更多详细信息,请参阅 QUnit 配置文档:http: //api.qunitjs.com/QUnit.config/
您最初的 Fiddle 是否可能会失败,因为您没有在每个测试开始时创建事件总线(在 setup() 方法中),所以当第二个测试运行时,您的第一个测试的异步事件可能会被触发,然后导致第二个测试处理它两次,调用 start() 两次。
请参阅我更新的 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();
});
});