【问题标题】:Handling several event listeners处理多个事件监听器
【发布时间】:2013-05-20 04:00:10
【问题描述】:

更新:这是我的问题。测试一次通过,下一次失败:

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

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


这是关于单元测试的一般问题。在我的应用程序中,触发了某个事件,并且我的应用程序的其他几个部分侦听此事件。我想分别对每个部分进行单元测试,因为它们执行不同的功能;但要做到这一点,我必须在每个测试中触发事件。

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

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

答案:

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

【问题讨论】:

    标签: unit-testing qunit


    【解决方案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

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多