测试失败然后成功

时间:2013-05-20 18:44:18

标签: backbone.js qunit

点击运行几次 - 这些测试在传递和失败之间交替。

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

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

答案:

Jeferson是对的。解决此问题的一种简单方法是使用events.once代替events.on。这样您就可以清理每次测试中的事件。

2 个答案:

答案 0 :(得分:2)

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

要修复你必须实现“asyncTest”并在准备好收集测试断言时调用start函数。

您的第二次测试失败并显示以下消息:

  

在启动时调用start()(QUnit.config.semaphore为0   已)

泰斯特 正是因为它是一个同步测试,已经开始了,你再次调用了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”函数,该函数将在一段时间(500毫秒)后调用,该函数应足以完成AJAX调用。

您必须根据需要调整此时间,并调整“testTimeOut”值,以便您的方法无法无限期运行。

有关详细信息,请参阅QUnit配置文档:http://api.qunitjs.com/QUnit.config/

答案 1 :(得分:1)

您的初始Fiddle可能不会因为您没有在每次测试开始时(在setup()方法中)创建事件总线而失败,因此第二次测试时可能会触发第一次测试的异步事件运行然后使第二个测试处理两次,调用start()两次。

请参阅我更新的小提琴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();
    });
});