Jasmine测试Backbone,确定问题

时间:2012-04-18 13:20:52

标签: javascript testing backbone.js jasmine

在为我当前的骨干系列之一编写茉莉花测试时,我真的遇到了一个恼人的错误,我认为这不是我编写测试的方式,而不是在我的javascript中做错了,jasmine想要告诉我。但我找不到解决方案。

我得到了以下简化代码,它将引导我们解决问题

class Stuff extends Backbone.Collection
    search: (str) ->
        @trigger('search', @_filter(@_convertStrToArray(str)))

    _convertStrToArray: (str) ->
        str.toLowerCase().split()

    _filter: (str_array) ->
        @filter (stuff) ->
            for _sub in str_array
                ... do something here

如果在执行@search时调用了@_convertStrToArray方法,我想用jasmine进行测试。我得到了以下测试(@stuff已在beforeEach语句中成功创建!)

...
it "should call _convertStrToArray", ->
    spyOn(@stuff, '_convertStrToArray')
    @stuff.search('cool stuff')
    expect(@stuff._convertStrToArray).toHaveBeenCalled()
...

我现在在茉莉花测试中遇到以下错误..

TypeError: Cannot read property 'length' of undefined

通过跟踪堆栈跟踪,我发现错误来自以下行:

for _sub in str_array

显然这里有一个范围问题,我无法解决。 _filter 方法中的 @filter 方法来自Backbone。脚本工作得非常好,我只是遇到测试问题。

我的问题:如何正确获取@filter调用中str_array变量的访问权限?

1 个答案:

答案 0 :(得分:1)

问题是你的间谍。 for _sub in str_array使用索引/长度检查进行迭代,但_convertStrToArray上的间谍不会返回任何值。

您需要在间谍定义的末尾添加.andCallThrough()

spyOn(@stuff, '_convertStrToArray').andCallThrough()

这将监视方法,但仍然会调用实际方法并返回它,以便在尝试使用结果时代码不会失败。