私の質問では、「モックイスト」TDD プラクティショナーとして、テスト対象のメソッドと同じクラスの他のメソッドをモックする必要がありますか? Avdi 氏は、「個人的には、自分自身を嘲笑することは、ほとんどの場合、コードの匂いだと思います。それは、動作ではなく実装をテストすることです」と答えました。彼は正しいかもしれませんが、多くの場合、実装と動作を区別できません。
役立つ答えにつながる可能性のある別の例 (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_from_spec_file コンポーネント クラス メソッドがコンポーネントのリストを読み取るファイルへのパスを取得するために、get_components メソッドが spec_filepath メソッドを呼び出すというものです。次に、spec_filepath メソッドが spec_dirpath を呼び出します。spec_dirpath は、スペック ファイルを含むディレクトリを VCS システムから同期し、そのディレクトリへのパスを返します。(このコードのバグを探さないようにしてください。結局のところ、これは疑似コードです。)
これらのメソッドをテストする方法についてのアドバイスを探しています...
spec_dirpath のテストは非常に簡単です。VCS クラスをモックし、モック オブジェクトを返して、適切なメソッドが呼び出されていることを確認します (そして、spec_dirpath メソッドがモックの dirpath メソッドが返すものを返すことを確認します)。
しかし、spec_filepath のテスト中に spec_dirpath をモックしない場合、spec_filepath テストで spec_dirpath コードから同じテスト コードを複製しないようにするにはどうすればよいでしょうか? また、get_components のテスト中に spec_filepath をモックしない場合、spec_filepathとspec_dirpath の両方からテスト コードが重複しないようにするにはどうすればよいでしょうか?