Я пишу модульные тесты для своего приложения Backbone. Определенные тесты запускают события, которые вызывают помехи между различными тестами.

Вот мои тесты

test('user setting a company should update the departmentslists url', function() {
    var Acme = new Company({ id:274, name: "Acme Solutions" });
    var companies = new CompanyList;
    var departments = new DepartmentList;
    new CompanySelectorView({ el: '#company-input', collection: companies });

    events.trigger('userSet:company', Acme);

    equal(_.result(departments, 'url'), 'http://'+document.location.host+'/data/companies/274/departments');
});

asyncTest('user setting a company should retrieve that companys departments', function() {
    var Acme = new Company({ id:274, name: "Acme Solutions" });
    var companies = new CompanyList;
    var departments = new DepartmentList;
    new CompanySelectorView({ el: '#company-input', collection: companies });

    events.trigger('userSet:company', Acme);

    events.on('fetched:departments', function(response) {
        deepEqual(response, [{id: "8",name: "Accounting"},{id: "1",name: "Client Services"},{id: "470",name: "Systems"},{id: "1187",name: "Managers"}]);
        start();
    })

});

И соответствующая часть моей коллекции:

var DepartmentList = Backbone.Collection.extend({

    initialize: function() {
        var self = this;

        events.on("userSet:company", function(company) {
            self.selectedCompany = company;
            self.fetch({
                success: function(collection, response, options) {
                    events.trigger("fetched:departments", response);
                }
            });
        });
    },

    model: Department,

    selectedCompany: '',

    url: function() {
        return 'http://'+document.location.host+'/data/companies/'+this.selectedCompany.id+'/departments';
    }

});

Какое здесь решение? Я хочу отделить эти два теста друг от друга, поскольку это разные вещи, но я также хочу, чтобы триггер события был включен в мой тест.

PS: Я новичок в Backbone и модульном тестировании, любая критика более чем приветствуется.

0
Sam Selikoff 19 Май 2013 в 03:56

1 ответ

Лучший ответ

Самый простой способ решить эту проблему - использовать events.once вместо events.on. Таким образом, ваши события очищаются после каждого теста.

0
Sam Selikoff 21 Май 2013 в 19:21