1

私の質問では、「モックイスト」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_filepathspec_dirpath の両方からテスト コードが重複しないようにするにはどうすればよいでしょうか?

4

2 に答える 2

1

単体テストは、何らかの形式の依存性注入を使用するとうまく機能します。この場合、コードでクライアントを作成しているため、テストで依存関係を作成します。これには、何らかの形式の動的モックに対処する必要があります。(この場合、部分的なモックを使用して、依存関係を作成する呼び出しをモックし、それらの依存関係もテストする必要がないようにします)。

起動時に依存関係を挿入する (つまり、クライアント オブジェクトを渡す) と、簡単にモックでき、1 つのクラスだけをテストする大きな問題は発生しません。

したがって、これらの目的を達成するには、部分モックまたは依存性注入ソリューションが必要です。

于 2008-10-22T00:07:52.487 に答える
1

通常、単体テストでは、動作は外部から観察可能な動作を指します。

あなたの例を使用すると、観察可能な動作は、get から返されるコンポーネントのリストになります。それらがファイルから来るという事実は実装であるため、適切なファイルを提供するセットアップコードを使用して、クラスの内部にあるファイルの取得をモックすることなく、返されたコンポーネントのリストを中心にテストを構築することをお勧めします。

別の方法としては、クラスの依存関係からコンポーネントがロードされたファイルを作成することです。たとえば、コンストラクターのパラメーターまたはメソッドのパラメーターにして、ファイルをクラスの外部で指定できるようにします。この場合、それは外部になるので、クラスが正しく使用されていることを確認するために、それから一貫した動作が得られるようにモックします。

于 2008-10-21T23:13:57.650 に答える