更新:这是我的问题的一个小提琴。测试通过一次,下次失败:
http://jsfiddle.net/samselikoff/hhk6u/4/
问题是departments
有events.on("userSet:company")
,因此两个变量都会对事件做出响应。
这是关于单元测试的一般问题。在我的应用程序中,某个事件被触发,我的应用程序的其他几个部分都在监听此事件。我想分别对每件作品进行单元测试,因为他们正在执行不同的功能;但要做到这一点,我必须在每次测试中解雇事件。
这会导致问题,因为第一个测试必须触发事件,在其他测试中触发侦听器。如何在测试多个事件侦听器的同时保持测试的原子性?
(我正在使用QUnit,但我认为这是一个更通用的单元测试问题。)
答案:
Jeferson是对的。解决此问题的一种简单方法是使用events.once而不是events.on。这样您就可以清理每次测试中的事件。
答案 0 :(得分:1)
应该使用“asyncTest”方法测试所有对异步方法的调用,并确保在准备好收集和分析断言数据时将调用包装在调用QUnit.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();
});
});
有关详细信息,请参阅此问题中的答案: Test fails then succeeds
希望这能帮到你!