2012-07-18 6 views
1

스텁과 모의가 테스트에 매우 유용함을 발견했습니다. 하지만 한 가지는 궁금합니다. 예를 들어 명확하게 보여줄 것이라고 생각합니다.테스트 된 클래스의 메서드를 스텁하여 다른 메서드를 테스트하십시오.

Class A { 
    public function isOk() { 
     // some work 
    } 

    public function iAmDepend() { 
     if ($this->isOk()) { 
      // do work 
     } 
    } 
} 

class TestA { 
    public function testIsOk() { 
     // Test itOk here 
    } 

    public function testIAmDepend() { 
     mock(A)->method(isOk)->return(true); 
     // tests for iAmDepend 
    } 

} 

이렇게하는 것이 현명합니까? 테스트 된 클래스의 스텁 메소드. 아니면 규칙을 어기 는가?

추신. 나는 코드

+1

단위 테스트 용어의 종속성은 일반적으로 클래스가 종속되는 다른 클래스 *로 간주되며 동일한 클래스의 * 메소드 *가 아닙니다. 예를 들어, 일반적으로 클래스 A의 두 메소드를 조롱하고이를 단위 테스트로 테스트 할 다른 클래스 (예 : classB)의 조롱 된 종속성으로 제공합니다. – StuartLC

+0

일반적인 상황을 설명했습니다. 그러나 이상한가 궁금합니다. 이 테스트 방법을 권장하지 않는다는 진술을 이해해야합니까? 어쩌면 PHP에서 내가 스텁하려는 메소드를 선택할 수 있다는 점이 중요합니다. –

답변

1

귀하의 사례가 올바른지 즉 testIsOk 테스트 만 IsOktestIAmDependIAmDepend을 refactore 수 없습니다.

그러나 모의 스텁과 이해해야 할 중요한 차이점은 difference between mock and stub입니다. 당신의 예에서

, testIAmDependisOk 일부 인수로 호출이는 유닛 테스트에 대한 주장의 일부 된 것으로 확인되는 경우,이 모의입니다. 그렇지 않으면 스터브이고, 호출되었는지 여부를 확인하지 않을 것입니다.

+0

좋아, 그래서 여기에 스터 빙 :) 답변 해줘. 나는 누군가가 너의 의견에 동의 할 지 궁금해. –

+0

예를 들어,'RhinoMock'과 다른 .Net 모의 프레임 워크는 ** 부분 모의 ** 개념을 가지고 있습니다. 이를 사용하여 _CUT_ (테스트중인 클래스)의 객체를 만들고, 메소드의 일부에 스텁 또는 모의 객체를 정의한 다음 일부 조건에서 CUT의 동작을 선언 할 수 있습니다. 따라서 외부 리소스 또는 종속성을 사용하여 작업을 조롱하고 오류 처리 만 주장 할 수 있습니다. 당신의 모범과 똑같이. – Akim

+0

좋아요! 고마워요 :) –