1

私は1つのパブリックメソッドと、パブリックメソッドに渡されるパラメータに応じて実行される多くのプライベートメソッドを持つクラスを持っているので、私のコードは次のようになります:

public class SomeComplexClass
{
    IRepository _repository;

    public SomeComplexClass()
       this(new Repository())
    {
    }

    public SomeComplexClass(IRepository repository)
    {
        _repository = repository;
    }


    public List<int> SomeComplexCalcualation(int option)
    {
        var list = new List<int>();

        if (option == 1)
            list = CalculateOptionOne();
        else if (option == 2)
            list = CalculateOptionTwo();
        else if (option == 3)
            list = CalculateOptionThree();
        else if (option == 4)
            list = CalculateOptionFour();
        else if (option == 5)
            list = CalculateOptionFive();

        return list;
    }

    private List<int> CalculateOptionOne()
    {
        // Some calculation
    }

    private List<int> CalculateOptionTwo()
    {
        // Some calculation
    }

    private List<int> CalculateOptionThree()
    {
        // Some calculation
    }

    private List<int> CalculateOptionFour()
    {
        // Some calculation
    }

    private List<int> CalculateOptionFive()
    {
        // Some calculation
    }
}

このクラスをテストする方法をいくつか考えましたが、どれも複雑すぎるか、必要以上にメソッドを公開しているように見えます。これまでのオプションは次のとおりです。

  • すべてのプライベート メソッドを internal に設定し、[assembly: InternalsVisibleTo()] を使用します。

  • すべてのプライベート メソッドを別のクラスに分離し、インターフェイスを作成します。

  • すべてのメソッドを仮想化し、私のテストでは、このクラスから継承してメソッドをオーバーライドする新しいクラスを作成します。

上記のクラスをテストするための、私がリストしたものよりも優れた他のオプションはありますか?

私がリストしたものの中から 1 つを選ぶとしたら、その理由を説明していただけますか?

ありがとう

4

5 に答える 5

8

これらのメソッドをテストするためにインターフェイスを変更する必要はありません。パブリック インターフェイスを徹底的にテストして、すべてのプライベート メソッドがテストされていることを確認します。

 void Test1() 
 {
      new SomeComplexClass(foo).SomeComplexCalcualation(1);
 } 

 void Test2() 
 {
      new SomeComplexClass(foo).SomeComplexCalcualation(2);
 } 

等々...

カバレッジ ツール ( .NET のNCoverなど) を使用して、テストしたいすべてのコードが実際にテストされていることを確認できます。

于 2010-04-29T15:37:51.313 に答える
4

元のクラスが作業をディスパッチする OptionCalculators はどうですか? それぞれに CalculateOption というメソッドが 1 つだけあり、もちろん公開されるため、簡単にテストできます。

于 2010-04-29T15:37:11.437 に答える
0

これらの計算のそれぞれがそれほど複雑である場合、それぞれが本当に単一の方法なのでしょうか? これらの計算がコードを共有する場合、またはそれぞれが複数のメソッドである必要がある場合、それは言及したインターフェース/戦略アプローチの引数であるため、これらの各ステップをテストできます。

考慮すべきもう 1 つの点: 1 つの public メソッドを徹底的に実行することは、a) ComputeOptionN コードが機能していること、および b) オプション チェックが適切に機能していることの 2 つをテストすることです。

文字通り int を渡す場合は問題ありませんが、特に比較がより複雑になる可能性がある場合や、変更される可能性がある場合は理想的ではありません。

于 2010-04-29T15:57:28.313 に答える
0

@カールは正しいです。これは、戦略パターンを利用することに他なりません。すべてcalculatorの を配列に格納し、配列を に注入しSomeComplexClassます。calculatorこれにより、それぞれを単独で単体テストし、 SomeComplexClass. 今、あなたはこれを行うことができます:

public List<int> SomeComplexCalcualation(int option)
{
     return calculator.find(option);
}

モックするのはとても簡単calculator

于 2010-04-29T19:39:11.387 に答える
0

クラス/インターフェイスのパブリック メソッドのみをテストする必要があります。

これらのパブリック メソッドのさまざまな動作をすべて徹底的にテストするのに十分なユニット テスト ケースがあることを確認する必要があります (これにより、プライベート メソッドが適切に実行されます)。

于 2010-04-29T15:39:37.793 に答える