3

これが重複している場合は申し訳ありません。List<string>メソッドのカバレッジを追加するタスクが与えられ、プライベートプロパティをモックするように言われました。私の質問は:プライベート フィールドをテストする方法はありますか?

私が見つけた解決策は、このプライベート リストを挿入するためだけに新しいコンストラクターを追加することです。これが正しい方法かどうかはわかりませんので、どんな助けでも大歓迎です。

public class Class1
{
    public Class1(List<string> list)//This is just for Unit Testing 
    {
        list1 = list;
    }


    private readonly InjectRepository _repository;
    //
    public Class1(InjectRepository repository)//This is the actual constructor
    {
        _repository = repository;
    }

    private List<string> list1 = new List<string>();

    public void Do_Complex_Logic()
    {
       //list1 will be set with items in it
       //Now list1 is passed to some other instance
    }
}
4

6 に答える 6

5

クラスのプライベート ロジックは、その動作のパブリック式で表示される必要があります。つまり、プライベート フィールドをテストする必要はまったくないはずです。

プライベート フィールドを直接テストする方法はありません。結局のところ、それらはプライベートです。プライベート フィールドのテストが本当に必要だと思う場合は、代わりにそれを内部に設定し、 [InternalsVisibleTo]属性を介して単体テスト アセンブリに公開することをお勧めします。

そうは言っても、 TypeMockなど、そのようなことを可能にするフレームワークがあります。

于 2012-07-19T16:58:17.933 に答える
4

プライベートフィールドまたはメソッドをテストしないでください。コントラクトの動作をテストします - public メソッドまたは internal メソッド。

つまり、次のことを試すことができます。

オプション A
プライベートメンバーを内部にし、テスト対象のアセンブリの属性を設定します。InternalsVisibleTo

オプション B
プライベート フィールド/メソッドをパブリック フィールド/メソッドにラップするラッパー クラスを記述します。このアプローチには、プライベート メソッドを内部にする必要がないという利点があります。欠点は、すべてのプライベート メソッドに対して、ラッパーのパブリック メソッドが存在することです。したがって、メソッドの量は 2 倍になる可能性があります。

于 2012-07-19T17:04:07.180 に答える
3

womp と oleksii がすでに言ったことに追加します -

プライベート メソッドをテストしたい、またはテストする必要があるという事実は、設計が正しくない可能性があるという兆候 (におい?) です。これは、TDD のプラスの副作用の 1 つです (そして私の個人的なお気に入りです)。

例:

ここであなたのドメインを完全に知っているわけではありませんが、簡単な変更の 1 つは、Do_Complex_Logicパラメーターを取らない代わりに、次のようにして返すことができますList<string>

public List<string> Do_Complex_Logic( List<string> input )

簡単なことですが、クラスを少し分解して、最初にテストを念頭に置いてビルドし直してみてください。

于 2012-07-19T17:14:16.200 に答える
1

私は他の答えに同意しません。しかし、この場合、私はあなたのコードを考えると、最も適切なことだと思います。の署名を変更することです

'Do_Complex_Logic'

本当の問題は、List1の「状態」を処理していることです。List1をDo_Complex_Logicに渡すと、問題はほぼ解決されます。あなたのコメントによると、「Do_Complex_Logic」は(おそらく)List1で何らかの作業を行い、それを他の何かに渡す予定ですよね?

Do_Complex_Logicにリストを取得させ、リストを返します。これで、テストが簡単になりました。クラスで正しく設定されているList1の状態に依存する代わりに、「依存関係を注入する」ことができます。

于 2012-07-19T17:09:53.913 に答える
1

そもそもプライベートフィールドってどうやって用意するの?リポジトリとのやり取りによるものであれば、そのオブジェクトをモックすることができます。

これを行う 1 つの方法は、インターフェイスを介してリポジトリと対話することです (IInjectRepository具体的なエンティティではなくそれを呼び出してから、 Moq (またはそこにある多くのモック フレームワークの 1 つ) のようなものを使用して、モックを介してデータを入力します。 d リポジトリをテストのセットアップに使用します。呼び出した後Do_Complex_Logic、エンティティに問い合わせて、期待どおりの動作をしたことがわかるようにする方法があると思います。この方法により、テスト専用のメソッドやクラスの追加を回避/軽減できます。 .

于 2012-07-20T01:13:27.333 に答える