2

单击运行几次 - 这些测试在通过和失败之间交替。

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

两个测试都需要companies,但我不知道如何隔离事件。有任何想法吗?

回答:

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

4

2 回答 2

2

您正在运行同步测试,而触发事件的回调是异步的。

要解决这个问题,您必须实现“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/

于 2013-05-21T10:32:40.663 回答
1

您最初的 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();
    });
});
于 2013-06-07T10:11:55.233 回答