2008-10-21 4 views
1

내 질문에 As a “mockist” TDD practitioner, should I mock other methods in the same class as the method under test?, Avdi "개인적으로 나는 자기에 대한 조롱은 거의 항상 코드 냄새라고 생각합니다. 그것은 행동보다는 구현을 테스트하고 있습니다." 그는 옳을 수도 있지만 구현과 행동을 구분할 수없는 경우가 종종 있습니다.테스트에서 코드 중복을 피하고 자기 조롱을 피하는 방법은 무엇입니까?

내가 도움이 답변으로 이어질 수 (파이썬 스타일의 의사 코드에서) 또 다른 예를 가지고 :

class Consumer: 

    def spec_dirpath: 
     client = VCS.get_connection(self.vcs_client_name) 
     client.sync() 
     return client.dirpath() 

    def spec_filepath: 
     filepath = os.path.join(spec_dirpath(), self.spec_filename) 
     if not os.path.exists(filepath): 
      raise ConsumerException 
     return filepath 

    def get_components: 
     return Components.get_components_from_spec_file(self.spec_filepath()) 

여기 아이디어는 get_components 방법은 경로를 얻기 위해 spec_filepath 메소드를 호출한다는 것입니다 get_components_from_spec_file Components 클래스 메소드가 구성 요소 목록을 읽는 파일. spec_filepath 메소드는 spec_dirpath를 호출합니다. spec_dirpath는 VCS 시스템의 spec 파일을 포함하는 디렉토리를 동기화하고 해당 디렉토리의 경로를 반환합니다.

을 나는이 방법을 테스트하는 방법에 대한 조언을 찾고 있어요 ...

테스트 spec_dirpath은 매우 간단합니다 - (이 결국 의사 코드의 코드에서 버그를 찾을 수 없습니다보십시오.) . VCS 클래스를 모의 해 mock 객체를 리턴하고 적절한 메소드가 호출되었는지 확인하십시오. spec_dirpath 메소드는 mock의 dirpath 메소드가 리턴하는 것을 리턴합니다.

그러나 spec_filepath를 테스트하는 동안 spec_dirpath를 모의하지 않으면 spec_filepath 테스트의 spec_dirpath 코드에서 동일한 테스트 코드를 복제하지 않는 방법은 무엇입니까? 그리고 get_components를 테스트하는 동안 spec_filepath를 조롱하지 않으면 spec_filepath spec_dirpath에서 테스트 코드를 중복하는 것을 피하려면 어떻게해야합니까?

답변

1

유닛 테스트는 어떤 형태의 의존성 주입으로 더 잘 작동합니다. 이 경우 코드에서 클라이언트를 작성하기 때문에 테스트에서 종속성을 생성하는 동적 모의를 필요로합니다. (이 경우 의존성을 만드는 호출을 조롱하기 위해이 경우 의존성을 테스트 할 필요가 없도록 부분 모의를 사용합니다.)

시작 (예 : 클라이언트 개체 전달)에 종속성을 삽입하면 쉽게 모방 할 수 있으며 한 클래스 만 테스트하는 데 큰 어려움이 없습니다.

그래서 이러한 목표를 달성하려면 부분 모의 또는 의존성 주입 솔루션이 필요합니다.

1

일반적으로 단위 테스트에서 동작은 외부에서 관찰 가능한 동작을 나타냅니다.

관찰 가능한 동작은 get에서 얻은 구성 요소 목록입니다. 파일에서 가져온 사실은 구현입니다. 따라서 파일 가져 오기를 조롱하지 않고도 구성 요소 목록 주위에서 테스트를 수행하는 것이 좋습니다. 그러면 해당 파일을 제공하는 설치 코드를 사용하여 클래스 내부에 있으므로 파일 검색을 조롱하지 않아도됩니다.

대체 방법으로 구성 요소가로드 된 파일을 클래스의 종속성에서로드하는 것입니다. 클래스에 외부 적으로 파일을 지정할 수 있도록 생성자 매개 변수 또는 메소드 매개 변수로 만듭니다. 이 경우에는 외부적일 수 있으므로 클래스를 올바르게 사용하고 있는지 확인하기 위해 일관된 동작을 보장하기 위해 조롱합니다.