【发布时间】:2012-02-14 10:10:11
【问题描述】:
我正在使用 Jasmin、Simon 和 jasmin-simon 测试主干视图。
代码如下:
var MessageContainerView = Backbone.View.extend({
id: 'messages',
initialize: function() {
this.collection.bind('add', this.addMessage, this);
},
render: function( event ) {
this.collection.each(this.addMessage);
return this;
},
addMessage: function( message ) {
console.log('addMessage called', message);
var view = new MessageView({model: message});
$('#' + this.id).append(view.render().el);
}
});
实际上,我所有的测试都通过了,但只有一个。我想检查是否在我向this.collection 添加项目时调用了addMessage。
describe('Message Container tests', function(){
beforeEach(function(){
this.messageView = new Backbone.View;
this.messageViewStub = sinon.stub(window, 'MessageView').returns(this.messageView);
this.message1 = new Backbone.Model({message: 'message1', type:'error'});
this.message2 = new Backbone.Model({message: 'message2', type:'success'});
this.messages = new Backbone.Collection([
this.message1, this.message2
]);
this.view = new MessageContainerView({ collection: this.messages });
this.view.render();
this.eventSpy = sinon.spy(this.view, 'addMessage');
this.renderSpy = sinon.spy(this.messageView, 'render');
setFixtures('<div id="messages"></div>');
});
afterEach(function(){
this.messageViewStub.restore();
this.eventSpy.restore();
});
it('check addMessage call', function(){
var message = new Backbone.Model({message: 'newmessage', type:'success'});
this.messages.add(message);
// TODO: this fails not being called at all
expect(this.view.addMessage).toHaveBeenCalledOnce();
// TODO: this fails similarly
expect(this.view.addMessage).toHaveBeenCalledWith(message, 'Expected to have been called with `message`');
// these pass
expect(this.messageView.render).toHaveBeenCalledOnce();
expect($('#messages').children().length).toEqual(1);
});
});
如您所见,addMessage 确实被调用了。 (它会登录到控制台并按应有的方式调用this.messageView。在监视addMessage 调用时我错过了什么?
谢谢,维克托
【问题讨论】:
-
您是否尝试过在 eventSpy 上设置期望值?
expect(this.eventSpy).toHaveBeenCalledOnce(); -
我想我已经回答了这个问题:stackoverflow.com/questions/8441612/…
标签: javascript testing jasmine sinon