2012-04-18 71 views
0

我对我目前的骨干群体之一写茉莉花测试时真正得到一个恼人的错误,我认为这不是我写的测试,而不是做一些错误的,我javascript和茉莉的方式想告诉我那个。但我找不到解决方案。茉莉花测试骨干,范围界定麻烦

我得到了下面的简化代码,这将导致我们的问题

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 

我想用茉莉花来测试,如果@_convertStrToArray方法被调用上执行@search。我得到了下面的测试(@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方法来源于骨干。这个脚本工作得很好,我只是在测试中遇到麻烦。

我的问题:我如何才能获得正确的上str_array变量访问@filter打电话?

回答

1

的问题是你的间谍。所述for _sub in str_array是使用索引/长度检查迭代,但在_convertStrToArray的窥探不返回任何值。

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

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

这将刺探的方法,但还是把实际的方法,它的返回值,以便您的代码不会当它尝试使用结果时失败。

+0

感谢您的帮助很大,这是它! – pabera 2012-04-18 14:07:12