В моем вопросе Как практикующий TDD «mockist», я должен высмеивать другие методы в том же классе, что и тестируемый метод? сам по себе почти всегда пахнет кодом. Он тестирует реализацию, а не поведение ". Он может быть прав, но часто я не могу различить реализацию и поведение.
У меня есть другой пример (в псевдокоде в стиле Python), который может привести к полезным ответам:
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 будет читать список компонентов. В свою очередь, метод spec_filepath вызывает spec_dirpath, который синхронизирует каталог, содержащий файл спецификации, из системы VCS и возвращает путь к этому каталогу. (Постарайтесь не искать ошибок в этом коде - это все-таки псевдокод.)
Я ищу совет о том, как проверить эти методы ...
Тестирование spec_dirpath должно быть довольно простым. Я могу смоделировать класс VCS и заставить его вернуть фиктивный объект и подтвердить, что были вызваны соответствующие методы (и что метод spec_dirpath возвращает то, что возвращает метод dirpath макета).
Но если я не высмеиваю spec_dirpath при тестировании spec_filepath, как мне избежать дублирования того же тестового кода из кода spec_dirpath в тесте spec_filepath? И если я не высмеиваю spec_filepath во время тестирования get_components, как мне избежать дублирования тестового кода из обоих spec_filepath и spec_dirpath?