我正在尝试测试单击一个元素时,调用一个函数。看起来很容易,但我必须错过一些愚蠢的东西,因为我似乎无法让这个简单的例子起作用。
这是我的观点
(function($) {
window.LaserMonitor = {
Views: {}
};
window.LaserMonitor.Views.WorkstationSummary = Backbone.View.extend({
tagName: 'li',
className: 'StationItem',
initialize: function() {
_.bindAll(this, 'showDetails');
this.template = _.template($("#WorkstationSummary").html());
},
events: {
'click h3' : 'showDetails'
},
showDetails: function() {
},
render: function() {
var renderedTmpl = this.template(this.model.toJSON());
$(this.el).append(renderedTmpl);
return this;
}
});
})(jQuery);
这是我的Jasmine测试:
describe('WorkstationSummary Item', function() {
beforeEach(function() {
_.templateSettings = {
interpolate: /\{\{(.+?)\}\}/g,
evaluate: /\{\{(.+?)\}\}/g
};
loadFixtures('LaserMonitorFixture.html');
this.model = new Backbone.Model({
id: 1,
name: 'D8',
assigned: 1900,
inProgress: 4,
completed: 5
});
this.view = new window.LaserMonitor.Views.WorkstationSummary({model: this.model});
});
describe('Events', function() {
beforeEach(function() {
this.view.render();
});
it('should trigger click event', function() {
this.header = this.view.$('h3');
spyOn(this.view, 'showDetails');
this.header.click();
expect(this.view.showDetails).toHaveBeenCalled();
});
});
});
此次运行的结果是:
错误:已调用showDetails上的预期间谍。 at new(http:// localhost:57708 / JobMgr2 / test-js / lib / jasmine-1.0.2 / jasmine.js:102:32) 在[object Object] .toHaveBeenCalled(http:// localhost:57708 / JobMgr2 / test-js / lib / jasmine-1.0.2 / jasmine.js:1171:29) 在[object Object]。 (HTTP://本地主机:57708 / JobMgr2 /测试-JS /规格/ LaserMonitorSpec.js:33:34) 在[object Object] .execute(http:// localhost:57708 / JobMgr2 / test-js / lib / jasmine-1.0.2 / jasmine.js:1001:15) 在[object Object] .next_(http:// localhost:57708 / JobMgr2 / test-js / lib / jasmine-1.0.2 / jasmine.js:1790:31) 在http://localhost:57708/JobMgr2/test-js/lib/jasmine-1.0.2/jasmine.js:1780:18
编辑:为completness添加夹具模板:
<script type="text/template" id="WorkstationSummary">
<h3>{{ name }} ({{ assigned }}/{{ inProgress }}/{{ completed }})</h3>
<ul>
</ul>
</script>
答案 0 :(得分:5)
如果你为方法创建一个间谍,在运行测试时,调用间谍而不是调用实际方法。间谍是该方法的包装器。但问题是你在创建间谍之前创建了视图。所以实际的方法是调用而不是间谍。您需要做的是在创建视图对象之前创建间谍。我使用sinon.js来监视方法。而且你必须使用视图的原型来监视该视图的方法:
var workStationSpy = sinon.spy(window.LaserMonitor.Views.WorkstationSummary.prototype, "showDetails");
this.view = new window.LaserMonitor.Views.WorkstationSummary({model: this.model});
this.view.render();
expect(workStationSpy).toHaveBeenCalled();
workStationSpy.restore();
答案 1 :(得分:0)
我会将其更改为以下内容并尝试:
it('should trigger click event', function() {
var viewToTest = this.view;
this.header = viewToTest.$('h3');
spyOn(viewToTest, 'showDetails');
this.header.click();
expect(viewToTest.showDetails).toHaveBeenCalled();
});
我担心调用“this.view”可能导致范围问题。这是一个疯狂的猜测,我没有测试,但我认为它值得一试。祝你好运!