我正在使用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;
}
});
答案 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。