backbone.js 如何测试对eventSpy的期望

f3temu5u  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(151)

我正在尝试在保存时测试一个 Backbone 模型。
这是我的代码。
从注解中可以看出,toHaveBeenCalledOnce方法存在问题。
附言:
我使用的是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');
        });
    });

控制台.log(应为(此.事件间谍));

cld4siwp

cld4siwp1#

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库间谍,并将它传递给一个期待Jasmine间谍的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将有更多的信息显示。

lnlaulya

lnlaulya2#

有一个名为jasmine-sinon的库,它为jasmine添加了特定于sinon的匹配器。
它可以让你做一些事情,比如

expect(mySpy).toHaveBeenCalledOnce();
expect(mySpy).toHaveBeenCalledBefore(myOtherSpy);
expect(mySpy).toHaveBeenCalledWith('arg1', 'arg2', 'arg3');
iovurdzv

iovurdzv3#

请尝试使用toHaveBeenCalledTimes方法:

expect(this.eventSpy).toHaveBeenCalledTimes(1);

相关问题