17

動作駆動開発に従ってプログラミングしようとしています。これは、最初に失敗した単体テストを記述せずにコード行を記述すべきではないと述べています。

私の質問は、プライベート メソッドで BDD を使用する方法ですか?
プライベート メソッドを単体テストするにはどうすればよいですか?
次よりも優れた解決策はありますか?
- 最初にプライベート メソッドをパブリックにしてから、それらのプライベート メソッドを使用するパブリック メソッドを作成するときにそれらをプライベートにします。
または
- C# では、すべてのプライベート メソッドを内部にし、InternalsVisibleTo 属性を使用します。

4

12 に答える 12

22

コードをテスト ファーストで記述する場合は、パブリック インターフェイスに対して記述します。この時点では、プライベート メソッドはありません。

次に、テストに合格するコードを記述します。そのコードのいずれかがプライベート メソッドに組み込まれても、それは重要ではありません。パブリック インターフェイスで使用されるという理由だけで、そこにあるはずです。

コードが最初にテストで書かれていない場合は、とにかく .net では、リフレクションを使用してプライベート メソッドを直接生成できます。これは最後の手段のテクニックですが。

于 2009-10-17T22:30:28.993 に答える
10

プライベート メソッドは、内部実装の詳細です。パブリック インターフェイスをテストすることで間接的にテストされるため、直接テストしないでください。なんらかの理由で、パブリック インターフェイスが完全にテストされているときにプライベート メソッドがカバーされていない場合、プライベート メソッドは不要であり、削除する必要があります。

一般に、テスト コードを非公開の実装の詳細にバインドすることはお勧めできません。これにより、テストがこれらのプライベートな詳細に結合され、公開されているインターフェイスや動作に影響を与えなくても、それらの詳細を自由に変更する自由が減ります。これにより、単体テストを作成して維持するために必要な労力が増加します。これはマイナスなことです。パブリック インターフェイスにのみバインドしながら、できるだけ多くのカバレッジを確保するように努める必要があります。

于 2009-10-17T22:30:03.713 に答える
8

簡単な答え:プライベート メソッドはテストしません。

適切にプログラミングした場合、テストのコード カバレッジはプライベート メソッドを暗黙的にテストする必要があります。

于 2009-10-17T22:33:40.607 に答える
6

簡単な答え: プライベート メソッドをテストすることはできません。

長い答え: プライベート メソッドをテストすることはできませんが、それが行うことを何でもテストしたい場合は、コードのリファクタリングを検討してください。2 つの簡単な方法があります。

  • プライベート メソッドにアクセスするパブリック メソッドをテストします。
  • プライベート コードを独自のクラスに抽出します。つまり、適切に公開できるように実装を移動します。

前者は単純ですが、より多くのテストを作成するにつれて、自分の足を撃つようになる傾向があり、後者はより良いコードとテスト設計を促進します.

でたらめな答え: わかりました、だから私は嘘をつきました。いくつかのリフレクション マジックを使用してプライベート メソッドをテストできます(一部の TDD ツールはプライベート メソッドのテストをサポートしています)。ただし、私の経験では、複雑な単体テストにつながります。複雑な単体テストはコードの質を低下させます。より悪いコードは怒りにつながります。怒りは憎しみにつながります。憎しみは苦しみにつながる…

生産コードが悪化することの直接的な影響は、テスト対象のクラスが大きくなり、多くのことを処理する傾向があり (単一責任の原則に違反)、保守が困難になることです。これは、TDD の目的、つまり製品コードをテスト可能、拡張可能、さらに重要なことに再利用可能にするという目的を無効にします。

デプロイされたクラスのテストを作成している場合は、プライベート メソッドを呼び出すすべてのものを調査し、それに応じてテストを作成できます。クラスを書き直す機会があれば、クラスを分割してリファクタリングしてください。運が良ければ、コードを再利用して利用できるようになります。

于 2009-10-17T23:30:50.807 に答える
6

プライベート メソッド メソッドが存在する場合、それはパブリック メソッドによって使用されます。したがって、パブリック メソッドのテストを作成します。

クラスの公開部分をテストするテストを作成します。クラスが適切に設計されている場合、プライベート パーツはデフォルトでテストされます。

プライベート メソッドがパブリック メソッドから呼び出されない場合、なぜそれが存在するのでしょうか?

あなたの場合、私は次のことをします

* Write failing test for the public method
* Write public method that calls the private method that doesn't exist yet(test still fails as your class is incomplete
* Write the private method
* Test should now pass
于 2009-10-17T22:28:55.790 に答える
3

PrivateType と PrivateObject をそれぞれ使用して、静的メソッドとインスタンス化されたプライベート メソッドを単体テストできます。次の 2 つの記事では、これらの手法について説明します。

1. C#.NET でのプライベート静的メソッドの単体テスト

2. C#.NET でのプライベート インスタンス メソッドの単体テスト

于 2011-12-28T13:42:17.357 に答える
2

これには Mbunit Reflector が役立ちます。

Reflector objectReflection = new Reflector(new ObjectWithprivateMethods());
objectReflection.InvokeMethod(AccessModifier.NonPublic,,"Add",1,6));

それに関するブログ記事。

于 2009-10-17T23:50:39.970 に答える
2

プライベート メソッド自体をテストしないこと、およびパブリック API に対してテストを作成する必要があるという点には同意しますが、上に挙げていない別のオプションがあります。

メソッドを保護し、テスト対象のクラスから派生させることができます。派生クラスのパブリック メソッドを使用して、基本保護メソッドを公開できます。たとえば、次のようになります。

public class TestableClassToTest : ClassToTest
{
    public new void MethodToTest() 
    { 
        base.MethodToTest(); 
    } 
}

この抽出とオーバーライドパターンを既に使用して、依存関係の挿入のために基本クラスの仮想プロパティをオーバーライドしている可能性があります。その場合、これは実行可能なオプションになる可能性があります。

于 2009-10-17T23:21:29.217 に答える
1

クラスの外部 API、つまりパブリック メソッドのみをテストする必要があります。テストがプライベート メソッドのコードにヒットしない場合は、さらにテストを作成するか、クラスをリファクタリングする必要があります。

API、特にサードパーティに配布される API をテストすることの要点は、パブリック メソッドの外部契約を破らない限り、クラスの内部構造を好きなだけ変更できることです。 .

あなたが特定したように、これは、テストのためにすべてのメソッド呼び出しを事前にセットアップする必要がある、モック クラスを使用する「従来の」TDD よりも BDD の出番です。私はこれらのどちらの専門家でもありません。他の誰かが私よりもうまく答えてくれることを願っています。

于 2009-10-17T22:30:36.087 に答える
0

プライベート メソッドがそれ自体の単体テストに値するほど複雑であると本当に信じている場合は、クラスがやりすぎていることを示しており、そのプライベート メソッドの一部またはすべてをインターフェイスの背後にある独自のクラスに抽出する必要があります。 .

元のクラスをテストするときにインターフェイスをモックします。以前はプライベート メソッドだった新しいクラスへのパブリック アクセサーが必要です。

不十分に記述された、または TDD を使用して記述されていない古いコードを扱う場合、プライベート クラスをテストする必要がある場合があります。この場合、リフレクションを使用する必要がありますが、可能であればコードを更新して、TDD アプローチに近づけてください。

于 2013-06-06T23:39:07.147 に答える
0

プライベート メソッドをテストしたい場合は、その中に何か複雑なものがあり、それをテストしたいと思うのはおそらく正しいでしょう。これは設計上の臭いです。インターフェイスでメソッドを公開すると、ある匂いが別の悪い匂いに置き換わるだけです。

リファクタリングの時間:)

通常、内部の複雑さをヘルパー クラスに分解します。ただし、「Feature Envy」または「不適切な親密さ」の方法を確認してください。メソッドが生きるにはもっと良い場所があるかもしれません。.net の拡張メソッドを使用すると、基本型でさえ良い候補になる可能性があります。

幸運を

于 2010-04-12T04:35:20.810 に答える