当Backbone.Model发生变化时,我应该如何检查Backbone.View

时间:2012-09-13 09:46:54

标签: javascript backbone.js jasmine marionette

我正在使用backbone和backbone.marionette通过jasmine为web应用程序编写测试。

我的问题是:
1)当模型中的某些内容发生变化时,我应该查看视图以查看视图是否受到影响吗? 2)如果是,那么正确的方法是什么......例如,在以下情况(1)

P.S .:
我想避免更改模板文件


(1)

// template 

<ul class="widget-points-status">
    <li>
        <strong>{{ remaining_points }}</strong>
    </li>
    <li>
        <strong>{{ given_points }}</strong>
    </li>
    <li>
        <strong>{{ received_points }}</strong>
    </li>
</ul>

// My jasmine test could be:

describe('Changing the model:', function () {
    beforeEach(function () {
        app.currentUser.set({
            given_points: 111980,
            received_points: 892378,
            remaining_points: 435412
        });
    });

    it('it should change the points', function () {
        var pointsView = this.view.$el.text().match(/\d{1,}/)[0];
        expect(pointsView).toMatch(app.currentUser.get('given_points'));
        expect(pointsView).toMatch(app.currentUser.get('received_points'));
        expect(pointsView).toMatch(app.currentUser.get('remaining_points'));
    });

});

var pointsView = Backbone.View.extend({

    className: 'widget widget-profile',

    initialize: function () {
        app.currentUser.on('change', this.render, this);
    },

    render: function () {
        this.$el.html(profileTemplate(app.currentUser.toJSON()));

        return this;
    }
});

1 个答案:

答案 0 :(得分:1)

如果您的视图侦听模型事件,您可以使用间谍来检查更改模型时是否调用了侦听器。

describe("A Backbine View", function() {

    beforeEach(function() {
        spyOn(pointsView, "changePoints");
    });

    it("should listen to model changes", function() {
        app.currentUser.set("points", 2);
        expect(pointsView.changePoints).toHaveBeenCalled();
    });
});

当然,如果你有render作为听众,同样的概念也适用。

我个人不会在Jasmine中明确检查渲染,因为只有在浏览器中运行测试时才会有效。例如,如果您使用Jasmin for Maven,那么您就拥有Rhino,因此无法使用DOM。