0

現在のバックボーン コレクションの 1 つに対して 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 メソッドが呼び出された場合、ジャスミンでテストしたいと思います。次のテストを取得しました (@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 変数に正しくアクセスするにはどうすればよいですか?

4

1 に答える 1

1

問題はあなたのスパイです。for _sub in str_arrayインデックス/長さチェックを使用して反復していますが、スパイされたもの_convertStrToArrayは値を返しません。

.andCallThrough()スパイ定義の最後に追加する必要があります。

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

これはメソッドをスパイしますが、実際のメソッドとその戻り値を呼び出して、結果を使用しようとしてもコードが失敗しないようにします。

于 2012-04-18T13:54:00.690 に答える