我正在尝试在保存时测试backbone.model
这是我的代码。
正如您从评论中看到的那样,toHaveBeenCalledOnce
方法存在问题。
P.S .:
我使用的是jasmine 1.2.0和Sinon.JS 1.3.4
describe('when saving', function ()
{
beforeEach(function () {
this.server = sinon.fakeServer.create();
this.responseBody = '{"id":3,"title":"Hello","tags":["garden","weekend"]}';
this.server.respondWith(
'POST',
Routing.generate(this.apiName),
[
200, {'Content-Type': 'application/json'}, this.responseBody
]
);
this.eventSpy = sinon.spy();
});
afterEach(function() {
this.server.restore();
});
it('should not save when title is empty', function() {
this.model.bind('error', this.eventSpy);
this.model.save({'title': ''});
expect(this.eventSpy).toHaveBeenCalledOnce(); // TypeError: Object [object Object] has no method 'toHaveBeenCalledOnce'
expect(this.eventSpy).toHaveBeenCalledWith(this.model, 'cannot have an empty title');
});
});
的console.log(期望(this.eventSpy));
答案 0 :(得分:2)
Jasmine没有功能toHaveBeenCalledOnce
。你需要亲自检查一下。
expect(this.eventSpy).toHaveBeenCalled();
expect(this.eventSpy.callCount).toBe(1);
所以我想在你的情况下,你想要这个:
expect(this.eventSpy.callCount).toBe(1);
expect(this.eventSpy).toHaveBeenCalledWith(this.model, 'cannot have an empty title');
你现在得到的错误,“期待一个间谍,但得到了功能”是因为正是这样。您正在使用Sinon库Spy,并将其传递给期望Jasmine Spy的Jasmine函数。
你应该这样做:
this.eventSpy = jasmine.createSpy();
或
expect(this.eventSpy.calledOnce).toBe(true);
expect(this.eventSpt.calledWith(this.model, 'cannot have an empty title')).toBe(true);
使用Sinon和Jasmine的原因是什么?我推荐第一个解决方案,从那时起Jasmine将有更多信息显示测试失败。
答案 1 :(得分:1)
有一个名为jasmine-sinon的库,它将僧侣特定的匹配器添加到茉莉花中。
它允许你做像
这样的事情expect(mySpy).toHaveBeenCalledOnce();
expect(mySpy).toHaveBeenCalledBefore(myOtherSpy);
expect(mySpy).toHaveBeenCalledWith('arg1', 'arg2', 'arg3');
答案 2 :(得分:0)
尝试使用 toHaveBeenCalledTimes 方法:
expect(this.eventSpy).toHaveBeenCalledTimes(1);