使用Jasmine和Sinon测试骨干模型 - 对象#<object>没有方法'spy'</object>

时间:2012-08-25 23:34:44

标签: testing backbone.js jasmine sinon

我正在尝试学习如何使用Jasmine和Sinon来测试Backbone应用程序,我正在关注this tutorial。然而,我遇到了一个我不知道如何解决的问题。

很可能解决方案很简单,但我需要一些指导......

在我的project.spec.js文件中,这是给出问题的代码:

it("should not save when name is empty", function() {
    var eventSpy = sinon.spy();
    this.project.bind("error", eventSpy);
    this.project.save({"name": ""});
    expect(this.eventSpy.calledOnce).toBeTruthy();
    expect(this.eventSpy.calledWith(
      this.project, 
      "cannot have an empty name"
    )).toBeTruthy();
});

这是可以在浏览器中看到的特定错误:

Failing 1 spec
7 specs | 1 failing
Project model should not save when name is empty.
TypeError: Object #<Object> has no method 'spy'
TypeError: Object #<Object> has no method 'spy'
    at null.<anonymous> (http://localhost:8888/__spec__/models/project.spec.js:53:26)
    at jasmine.Block.execute (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:1024:15)
    at jasmine.Queue.next_ (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2025:31)
    at jasmine.Queue.start (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:1978:8)
    at jasmine.Spec.execute (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2305:14)
    at jasmine.Queue.next_ (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2025:31)
    at onComplete (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2021:18)
    at jasmine.Suite.finish (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2407:5)
    at null.onComplete (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2451:10)
    at jasmine.Queue.next_ (http://localhost:8888/__JASMINE_ROOT__/jasmine.js:2035:14)

除了sinon.js库之外,我还安装了jasmine-sinon.js库(两者都在vendor / assets / javascripts文件夹中,并包含在application.js文件中)。

谢谢你, 珊

3 个答案:

答案 0 :(得分:6)

当我从GitHub(没有Sinon文件夹)下载sinon.js文件时遇到了这个问题。我通过从http://sinonjs.org/

下载库来解决问题

答案 1 :(得分:2)

我将基于上面的评论帖子将此作为答案发布。我们已经将问题缩小到调用sinon.spy()的行,因此它不是特定于此测试,而是如何加载sinon。

我怀疑问题是你在application.js中包含sinon和jasmine-sinon,当它们真的应该在spec / javascripts / spec.js中(以相同的格式)。尝试更改它,看看是否有任何变化。

更新:

根据下面的评论主题,似乎代码进入this.project.save(...)行但验证不起作用:我知道这是因为如果你在控制台中收到POST错误,就意味着该主干实际上发出了请求(因为名称为空,所以它不应该有)。所以你应该回去查看你实际测试的代码。

答案 2 :(得分:0)

我知道这个帖子已经过时了,但在阅读本教程http://tinnedfruit.com/2011/03/25/testing-backbone-apps-with-jasmine-sinon-2.html时,我今天遇到了类似的问题。看起来Backbone进行了更改,并在提供无效模型数据时调用“无效”事件,而不是“错误”。

如果您遇到此错误,请尝试更改:

it("should not save when name is empty", function() {
    ...
    this.project.bind("error", eventSpy);
    ...
});

要:

it("should not save when name is empty", function() {
    ...        
    this.project.bind("invalid", eventSpy);
    ...
});

这解决了我的问题。