2010-06-28 1 views
1

나는 클래스 B의 인스턴스가있는 클래스 A 있고, fooA의 호출 B의 상태를 업데이트 Bset 기능을 작동합니다. (모의 객체와 스텁과 무엇을 사용하지 않는) B의 구현에 A 비 의존성에 대한 테스트를 유지하면서무언가의 상태를 변경하기 위해 다른 클래스에 의존하는 클래스를 단위 테스트하려면 어떻게합니까?

A = function() { 
    this.init = function (b) { 
     this.b = b 
    } 

    this.foo = function (val) { 
     this.b.set(val) 
    } 

    this.bar = function() { 
     return this.b.get() 
    } 

} 

B = function() { 
    this.set = function (val) { 
     this.v = val 
    } 

    this.get = function() { 
     return this.v 
    } 
} 

방법, 내가 단위 테스트 foo 기능을 수행 여기에 (자바 스크립트에서) 코드 예입니다 ?

답변

0

A의 테스트가 구현에 의존하지 않도록하면서 가장 좋은 방법을 알아 냈습니다. getset이 있지만 임시 변수에 쓰는 mock B를 만드는 것이 좋습니다.

코드 예제 테스트하기 :

// Mock B 
b = new function() { 
    this.set = function (val) { 
     this.v = val 
    } 

    this.get = function() { 
     return this.v 
    } 
} 

// Create an instance of A with Mock B 
a = new A().init(b) 

// Test A 

// ... 
3

모의를 사용하면 A의 모의어를 B으로 넘기면 set이 적절한 값으로 호출되었는지 확인할 수 있습니다. 다음 A.foo를 호출하면 설치 b, 주어진 bA을 만들 시험에

b = { 
     setCalled: false, 
     expectedValue: <expected> 
     set: function(val) { 
     <check that val == this.expectedValue> 
      this.setCalled = true; 
     } 
    } 

b.setCalledtrue로 변경 확인 : 당신이 모의 프레임 워크가없는 경우, 자바 스크립트에서 당신은 단순히 객체를 생성 할 수 있습니다 . 마찬가지로 b에 get 메서드를 추가하여 A.bar을 확인할 수 있습니다.

이 경우 냄새 Feature Envy도 확인해야합니다. 두 클래스가 밀접하게 결합되어 있으면 잘못 사용하지 않았는지 확인해야합니다. 실제 예에서는 괜찮을 지 모르지만 확인해 볼 가치가 있습니다.

+0

"작은 기능 질투는" –

+0

이 테스트는 TDD에 대한 나쁜 구현에 따라 의미하지 않는다 "냄새"해야 하는가? 'foo'의 구현이 변경되어'B'의'set'을 사용하지 않으면 어떻게 될까요? – Chetan

+0

요청은 모의 B로 테스트하는 것이 었습니다. A의 외부 동작이 B에 어떤 영향을 미치지 않으면 B를 모의하지 않았습니다 (B가 외부 라이브러리 인 경우). 냄새에 관한주의 사항은 이러한 유형의 행동 (A)이 문제가 될 수 있다는 것입니다 –

관련 문제