Я действительно получил раздражающую ошибку при написании тестов jasmine для одной из моих текущих коллекций backbone, и я думаю, что это не так, как я пишу тест вместо того, чтобы делать что-то неправильно в моем 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
Я хотел бы проверить с жасмином, был ли вызван метод @_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 взят из Backbone. Скрипт работает абсолютно нормально, просто у меня проблемы с тестом.
Мой вопрос: как правильно получить доступ к переменной str_array в вызове @filter?