如何测试对eventSpy的期望

时间:2012-06-01 15:07:49

标签: javascript backbone.js jasmine sinon

我正在尝试在保存时测试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));

asddas

3 个答案:

答案 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);