2013-01-24 1 views
3

방금 ​​sinon.js을 사용하기 시작했으며 전문 용어가 완전히 뒤죽박죽입니다. subview's 렌더링 메소드가 스터브 아웃 된 스텁을 사용했습니다. 그러나 간첩에 대한 설명은 분명하지 않습니다. 아무도 정확하게이 두 가지의 차이점을 설명 할 수 있습니까?스파이와 스텁의 차이점은 무엇입니까?

또한 새로운 모델이 컬렉션에 추가되었는지 테스트하려는 경우 어떻게 될지 궁금합니다.

답변

6

저는 sinon.js에 익숙하지 않지만 일반적인 TDD 용어이며 사인 전용이 아니기 때문에 질문에 대답 할 수 있습니다.

가장 큰 차이점은 순전히 코드를 통과하기위한 스텁이라는 것입니다. 스텁 자체는 더미 값과 메소드를 보유하는 것 외에는 아무 것도하지 않습니다.

스파이 (Spie)는 그 안에 들어간 값이나 호출 된 메소드를 검사하는 스텁입니다. 다른 말로하면 두 가지의 주요 차이점은 단언 문입니다. 스텁에는 아무 것도없고 스파이에게는 일부가 있습니다 (그렇지 않으면 테스트 코드의 어딘가에 어설 션을위한 값을 저장합니다). 즉

:

var Stub = Backbone.Model.extend(); 
var stub = new Stub({value: 'test value'}); 
// This can be fed to any view for testing 

var Spy = Backbone.Model.extend({ 
    initialize: function() { 
     this.on('change:value', this.handleValueChange); 
    }, 
    handleValueChange: function(value) { 
     assert(!isNaN(value)); 
    }; 
    value: 'test value' 
}); 
var spy = new Spy({value: 'test value'}); 
// This can be fed to any view for testing AND it ensures that, 
// if that view sets its "value", that that value is a number 

아, 그리고 대답 :

또한 나는 새로운 모델이 추가 된 경우 테스트하려는 경우 접근 방식이 어떻게 될지 궁금

컬렉션?

는 다시, 특히 Sinon에받지 않고, 두 개의 명백한 장소가 어디 모델의 "스파이"할 수 있습니다 모델 자체, 그 수집.

this.collection을 검사하는 모델에 이벤트 처리기를 추가하거나 테스트 메서드에 하드 와이어 연결하여 어느 컬렉션에 추가되었는지 여부를 결정할 수 있습니다. 반대로 이벤트를 바인딩하거나 컬렉션 자체의 메서드를 덮어 쓸 수 있으며 this.models을 확인할 수 있습니다.

+0

@ machinghost .. 답장을 보내 주셔서 감사합니다. 이벤트 수신기에 바인딩 된 처리기를 스텁하려고했지만 여전히 수정 된 컬렉션을 확인할 수 없습니다. 여기에 올바른 접근법은 무엇입니까? 스파이 또는 스텁 사용 –

+0

더 간단한 솔루션이 더 좋기 때문에 일반적으로 스텁이 좋습니다. 스텁으로 당신은 : 1. 스텁을 만들고, 2. 그것을 무언가에 전달하고, 3. 결과에 대해 주장한다. 단순한. 당신은 오직 스파이를 사용하고 싶을뿐입니다 : A) 테스트 할 대상이 테스트 코드에 노출되지 않았기 때문에, 또는 B) 테스트가 더 편리 할 때 (예 : 관련 테스트를 많이하기 때문에) 그 모든 것은 같은 스텁 객체에 대해 유사한 어설 션을 수행합니다 ...) 그러나이 모든 것은 관련성이없는 것으로 보입니다. 실제 문제는 "수정 된 컬렉션을 확인할 수 없다"는 것입니다. 더 설명해 주시겠습니까? – machineghost

+0

나는 새로운 컬렉션을'add' 할 수있는 리스너를 가지고있다. 이 스텁을 만들었고이 이벤트가 발생한 후 컬렉션의 길이를 확인하려고합니다. 해고되기 전과 후에 여전히 같은 번호로 표시됩니다. –

관련 문제