7

単体テストを別のアセンブリに配置するための通常の議論を認識しています (そして同意します)。ただし、最近、プライベート メソッドを本当にテストしたい状況がいくつか発生しています。問題の舞台裏のロジックは非常に複雑であるため、パブリック インターフェイスと内部インターフェイスをテストしてもうまくいきません。クラスの public インターフェースに対するテストはやり過ぎのように感じます。また、private に対していくつかのテストを行うことで、より簡単かつ効果的に作業を完了できる箇所がいくつか見られます。

過去に、テストに必要なものをprotected作成し、テスト フレームワークでそれを取得するために使用できるサブクラスを作成することで、この種の状況に取り組んできました。しかし、そうあるべきクラスではうまくいきませんsealed。言うまでもなく、すべての足場でテスト フレームワークが肥大化します。

そのため、代わりにこれを行うことを考えています。クラスにいくつかのテストを配置して、プライベート メンバーを取得できるようにします。ただし、「#if DEBUG」を使用して、それらを製品コードから除外してください。

これは良い考えのように思えますか?

4

3 に答える 3

9

誰かに聞かれる前に...

OPの問題の解決策は、IoCをDIに適切に組み込み、プライベートメソッドを完全にテストする必要をなくすことです(Joel Martinezが指摘したように)。 も言及されているように、プライベート メンバーの単体テストは適切ではありません

ただし、コードを変更できない場合(レガシー システム、重大な変更のリスクなど) や、プライベート メンバー テストを可能にするツール (有料製品である Typemock など) を使用できない場合があります。そのような場合、まったくテストしないか、手抜きをすることができます。OPが直面している状況だと私は信じています。


プライベートメソッドのテストの議論は脇に置いておきます...

リフレクションを使用して、プライベート メンバーにアクセスして呼び出すことができることを忘れないでください。

私の意見では、クラス自体に条件付きデバッグを配置するのはかなり悪い考えです。クラス コードにノイズ(無関係なものなど) が追加されます。確かに、それはリリースでなくなりますが、あなた (およびおそらく他のプログラマー) は日常の基本でそれに対処する必要があります。

あなたのアイデアは紙の上ではうまく聞こえるかもしれません-条件付きデバッグでラップされた単純なテスト。しかし実際には、追加の変数(これらもクラス コードに配置する必要があります)、いくつかのユーティリティ(追加の参照、カスタム型)、テスト フレームワーク(さらに多くの参照) などをテストで使用することがすぐに判明します。これはすべて、何らかの方法でクラス コードに接続する必要があります。それをすべてまとめると、すぐに維持不可能なモンスターになってしまいます。

あなたはそれを処理したいですか?単純なリフレクション ベースのユーティリティをまとめることは、おそらくそれほど難しくないことを考えると特にそうです。

于 2012-06-14T15:36:24.047 に答える
7

Everything you're referring to can be solved with just two concepts: Single Responsibility Principle, and Dependency Injection. It definitely sounds like you need to simplify your classes. Mind you, that doesn't mean the class must offer less value, it just means that the internals need to be simpler and some functionality may have to be delegated to others.

于 2012-06-14T15:45:10.600 に答える
4

クラスのパブリック API とは別にこのメソッドをテストする必要がある場合は、クラス自体から削除する候補のように思えます。

クラスはプライベート メソッドに依存していると言えます (クラスのパブリック API とは別にテストする必要があることからも明らかです)。

型のパブリック APIだけをテストしてもこの依存関係を満たすことができない場合は、代わりにクラスにこの依存関係を別の型に委譲させます。このタイプを内部でインスタンス化するか、このタイプを注入/解決することができます。

パブリック API は以前はプライベート メソッドだったものを表現するため、この新しい型は独自の単体テストを持つことができます。

于 2012-06-14T15:50:17.250 に答える