2012-04-18 2 views
0

내 현재 백본 모음 중 하나에 대해 jasmine 테스트를 작성할 때 정말 짜증나는 오류가 발생했습니다. 자바 스크립트 및 재스민에서 잘못된 작업을 수행하는 대신 테스트를 작성하는 방식이 아니라고 생각합니다. 나. 하지만 해결책을 찾을 수 없습니다. Jasmine 백본, 범위 지정 문제

나는 내가 @_convertStrToArray 방법이 @search을 실행에 호출 된 경우, 자스민과 테스트하고자하는 문제

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 

우리를 이끌 다음과 같은 간단한 코드를 얻었다. 나는 (@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 메서드는 백본에서 제공됩니다. 스크립트는 절대적으로 잘 작동합니다. 테스트에 문제가 있습니다.

질문 : @filter 호출에서 str_array 변수에 대한 액세스 권한을 올바르게 얻으려면 어떻게해야합니까?

답변

1

문제는 스파이입니다. for _sub in str_array은 인덱스/길이 검사를 사용하여 반복하지만, _convertStrToArray에 대한 스파이가 아무 값도 반환하지 않습니다.

당신은 당신의 스파이 정의의 끝에 .andCallThrough()을 추가해야

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

이이 방법을 감시하지만, 여전히 실제 메서드를 호출하고는 반환 값의 코드가되지 않도록 결과를 사용할 때 실패합니다.

+0

큰 도움을 주셔서 감사합니다. – pabera