3

以前に尋ねたこの質問に関連して、ユニットテストでまた行き詰まっています。

protected私の現在の問題は、抽象Componentクラスのメソッドのテストに関連しています。

という名前のモック クラスの実装に成功しました。このモック クラスはConcreteComponent、抽象クラスが持つすべてのものを非常にうまく継承します。

つまり、単体テスト ファイル内にこの具象クラスを作成しました。保護されたメソッドをテストする唯一の方法は、プライベート アクセサーを使用することです。ただし、単体テストと同じファイル内にプライベート アクセサーを作成できないため、保護されたメソッドにアクセスできません。

モック コンクリート クラスを別のファイルの別の名前空間に配置しようとしましたが、これにより、単体テスト ファイルで使用できるプライベート アクセサーを作成できるようになりました。それはうまくいきましたが、単体テストと同じファイル内にこのモック具体的なクラスが必要であると考えました。

だから今、私は2つの質問があります:

1) この問題の可能な回避策は何ですか?

2) 単体テスト クラスと同じファイルと名前空間内にあるモック クラスのプライベート アクセサーを作成できないのはなぜですか?

4

2 に答える 2

2

PrivateObjectクラスを見て、テストでクラスの非パブリック API にアクセスできます。内部で反射を使用します。クラスの保護されたアセットは、この場合はサブクラスまたは派生クラスである外部クライアントへの API です。したがって、そのような API をテストしたいという欲求は理解できます。保護された API をテストするためだけに、クラスを汚染してパブリック API を公開することはお勧めしません。ただし、あなたの場合、派生クラスはテスト プロジェクトにあるため、実際にパブリック API を提供して、テストを容易にし、パフォーマンスを向上させることができます (反射が遅くなり、テストを実行している場合は、コードを変更するにつれて継続的なテストが行​​われ、テストの数などによっては、テストの実行が遅くなる場合があります)。

于 2013-03-04T12:05:30.673 に答える
0

クライアントに公開したくないため、保護された機能があります。ただし、保護されている場合は、保護されていない場合は、何らかの満足のいく条件を介してパブリック インターフェイスを介してアクセスされる可能性があるため、デッド コードなので削除してください。

だから黄金律は

1-テクノロジー(リフレクションなど)を使用してプライベート/保護されたメソッドのテストを回避しようとしないでください。パブリックインターフェイスを介してプライベート/保護されたユニットテストを試みてください。なぜVS 2008テストを使用しているのか、代わりにNUnitを使用していないのか

于 2013-03-04T11:51:44.843 に答える