내 질문에 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에서 테스트 코드를 중복하는 것을 피하려면 어떻게해야합니까?