【问题标题】:Jasmine testing Backbone, Scoping troubleJasmine 测试 Backbone,范围界定问题
【发布时间】:2012-04-29 21:59:35
【问题描述】:

在为我当前的一个主干集合编写 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 变量的访问权限?

【问题讨论】:

    标签: javascript testing backbone.js jasmine


    【解决方案1】:

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

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

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

    这将监视方法,但仍会调用实际方法及其返回值,以便您的代码在尝试使用结果时不会失败。

    【讨论】:

    • 感谢您的大力帮助,就是这样!
    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2016-04-16
    • 2012-06-27
    • 2015-02-15
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    相关资源
    最近更新 更多