2013-05-20 64 views
1

更新:这里是我的问题的小提琴。该测试通过一次,失败,下一次:处理几个事件听众

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

问题是departmentsevents.on("userSet:company"),所以这两个变量对事件作出响应。


这是关于单元测试的一般性问题。在我的应用程序中,某个事件被触发,我的应用程序的其他几个部分也会侦听此事件。我想单独测试每件作品,因为它们执行的功能不同;但要做到这一点,我必须在每次测试中将事件关闭。

这会导致问题,因为第一次测试必须触发事件,触发其他测试中的侦听器。在仍然测试多个事件侦听器的情况下,如何保持测试的原子性?

(我正在使用QUnit,但我认为这是一个更一般的单元测试问题)。

答:

Jeferson是正确的。解决这个问题的一个简单方法是使用events.once而不是events.on。这样你就可以从每个测试中清理你的事件。

回答

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

希望这可以帮助你!