我正在为我的 Backbone 视图/模型/集合编写一些集成测试。当我调用render
myView
时,它只是将模板呈现给它自己的el
属性,因此 html 只是存储在内存中而不是页面上。下面是一个简单的模型,以及一个带有绑定到 DOM 元素的点击事件的视图:
var model = Backbone.Model.extend({
urlRoot: '/api/model'
});
var view = Backbone.View.extend({
events: {
'click #remove': 'remove'
}
render: function () {
var html = _.template(this.template, this.model.toJSON());
this.$el.html(html);
},
remove: function () {
this.model.destroy();
}
});
我正在使用 Jasmine 编写测试。在下面的测试中,我要做的就是监视该函数,以查看在为我传递给视图的模板中存在remove
的元素触发 click 事件时是否调用它。#remove
// template
<script id="tmpl">
<input type="button" value="remove" id="remove"/>
</script>
// test
describe('view', function () {
var view;
beforeEach(function () {
view = new view({
template: $('#tmpl').html(),
model: new model()
});
});
it('should call remove when #remove click event fired', function () {
view.$('#remove').click();
var ajax = mostRecentAjaxRequest();
expect(ajax.url).toBe('/api/model');
expect(ajax.method).toBe('DELETE');
});
});
但是,由于该#remove
元素在内存中,并且实际上并未添加到 DOM 中,因此我不确定您将如何模拟单击事件。事实上,我什至不确定这是否可能?
想要在测试中执行此操作似乎有点奇怪,但是通过我的测试,我试图测试行为而不是实现,这样我就不关心两者之间发生了什么——我只想测试一下,如果用户点击#remove
一个DELETE
请求被发送回服务器。