0

アプリケーションに単体テストを作成する必要がありますが、問題があります。私は C# と .NET 4 を使用しています。私のテストでは、クラスのプライベート プロパティとメソッドにアクセスできないため、ユニット テストではすべてのクラスに対して自動生成されたアクセサーを使用していますが ...

アクセサー クラスのコンストラクターは、引数を受け入れません。例:

class SearchControl(bool isLogged, MainWindow mainWindow);
class MainWindow();

SearchControlタイプのオブジェクトを作成するには、 mainWindow オブジェクトを渡す必要があります。したがって、アクセサー クラス以外でこれを作成すると、プライベート メソッドとプロパティにアクセスできず、それらをテストすることもできません。

MainWindow mainWindow = new MainWindow();
SearchControl serchControl = new SearchControl(false, mainWindow);

アクセサークラスを使用する必要がありますが、これを行うと、コードに赤の下線が引かれ、Visual Studio は引数を受け入れることができないと言います。なぜ、同じ型の引数を渡すときに。MainClassオブジェクトをSearchControl_Accessorオブジェクトに再度渡すと、 MainClass のプロパティにアクセスできませ。したがって、アクセサーを使用したコードは次のようになります。

MainWindow_Accessor mainWindow = new MainWindiow_Accessor();
SearchControl_Accessor searchControl = new SearchControl_Accessor(false, mainWindow);

何が間違っているのか、それを修正するために何をしなければならないのかを知っている人。ありがとう :)

4

2 に答える 2

5

プライベート メソッドを単体テストする必要がある場合、そもそもクラスの設計が悪いのでしょうか? 私の(やや弱いと認める)理解では、「外の世界」はオブジェクトのプライベートメソッドを気にするべきではなく、ボックスの右側に書かれていることを行うかどうかだけです。プライベート メソッドは「コントラクト」の一部ではありません。その実装、戻り値の型などはすべて変更される可能性があり、重要なのはパブリック API です。

オブジェクトのパブリック メソッドはテストに合格し、プライベート メソッドは失敗するシナリオはどれですか? それが可能な場合は、次のいずれかです。

  • public メソッドが適切にテストされていない、または
  • プライベート メソッドは問題ではありません。オブジェクトの動作には影響しないため、テストする必要はありません。

または、それは不可能ですが、プライベート メソッドをテストして、どのパブリック メソッドが予期しない動作を引き起こすかを突き止めたいですか?

その場合は、次のことを示している可能性があります。

  • これらのパブリック メソッドは小さくする必要があります (少ないことを行い、そのおかげで、どのプライベート メソッドが有罪であるかについて完全に困惑することはありません)。
  • 良い考えは、依存しているプラ​​イベート メソッドが誤動作したときに特定の例外をスローすることです。次に、それらの例外のパブリック メソッドをテストします。
于 2012-05-19T11:50:05.383 に答える
4

通常、オブジェクトのプライベート プロパティ、メソッド、およびフィールドにアクセスすることはできません。本当にアクセスする必要がある場合は、internal(の代わりにprivate) それらを作成することを検討できます。テストが別のアセンブリにある場合は、InternalsVisibleTo属性を確認してください。その属性を、テストするコードを含むアセンブリに正しく適用すると、テストを含むアセンブリが、マークしたメソッド、フィールド、およびプロパティにアクセスできるようになりますinternal

不明確な用語 (アクセサー クラス) を使用しているため、質問を正しく理解できたことを願っています。詳細を知りたい場合は、説明または質問してください。

于 2012-05-19T11:12:20.100 に答える