Jasmine тестирует Backbone, проблемы с определением масштаба

Я действительно получил раздражающую ошибку при написании тестов 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?


person pabera    schedule 18.04.2012    source источник


Ответы (1)


проблема в твоем шпионе. for _sub in str_array использует проверку индекса/длины для итерации, но шпион _convertStrToArray не возвращает никакого значения.

Вам нужно добавить .andCallThrough() в конец вашего определения шпиона:

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

Это будет отслеживать метод, но по-прежнему будет вызывать фактический метод и его возвращаемое значение, чтобы ваш код не потерпел неудачу, когда попытается использовать результат.

person Derick Bailey    schedule 18.04.2012
comment
Спасибо за вашу большую помощь, это было оно! - person pabera; 18.04.2012