2

TDD を使用して製品を開発しているとしましょう。テストを段階的に追加すると、最終的には大きなメソッドになります。ここでリファクタリングを行います。そのため、メソッドをより小さなメソッドに分割します。例えば;

// Before refactoring.
public void SomeMethod()
{
    // ...
    int sum = numbers.Sum();
    // ...
}

// After refactoring.
public void SomeMethod()
{
    // ...
    int sum = GetSumOfNumbers(numbers);
    // ...
}

private GetSumOfNumbers(int[] numbers)
{
    return numbers.Sum();
}

GetSumOfNumbersこのステップの後、メソッドのテストを作成する必要がありますか? 私たちがテストするときSomeMethod、私たちはすでにテストしていると思いますGetSumOfNumbers。しかし同時に、 を使用する他の方法があるGetSumOfNumbersかもSomeMethodしれません。これにより、問題をより迅速に見つけることができます (テストでより具体的なエラーが発生するため)。しかし同時に、これは役に立たないかもしれず、冗長になります。

あなたはそれについてどう思いますか?また、この例ではGetSumOfNumbersメソッドが非公開になっているため、非公開だからといってテストするべきではないと考える場合、公開されている場合はテストする必要がありますか?

4

3 に答える 3

5

クラスのパブリック API をテストする必要があります。プライベート メソッドをテストしないでください。これを行うと、クラスとの結合が強すぎるテスト スイートが作成されます。クラスのすべての内部変更は、テスト スイートのいくつかのテストを壊します。

特定のプライベート メソッドをテストする必要があると考えている場合 (おそらく複雑または複雑なロジックを実行するため)、それは、そのメソッドを新しいクラスに移動する時期である可能性があることを示しています。

于 2013-02-06T10:13:32.570 に答える
1

設計をよりテストしやすくするためのプロセスの半分に達したと結論付けたくなる誘惑にかられます。public メソッドを増やしたり、ほとんどすべての private メソッドのクラスを作成したりすることは、決して「常に良い」わけではないことに注意してください。

リファクタリング中に私が従う通常のアプローチは、あなたが取っているものとまったく同じです。

  • 長いメソッドにリファクタリング「メソッドの抽出」を適用します (1)

それが完了すると、新しいオブジェクトと、作業をプライベート メソッドに委譲するだけの小さなパブリック メソッドとを区別できるはずです。

  • リファクタリング「private メソッドのクラスを導入する」(2) を適用します。

あなたのデザイン/アーキテクチャでそれが理にかなっていれば! 依存性注入を使用してオブジェクト参照を SuT (テスト対象) に渡し、その動作をモックできるようにします。その後、以前のプライベート メソッドを表す、作成するクラスの新しいテストを作成できます。

一つ付け加えておきたいことがあります。「テストを書きたくないという理由だけで」、プライベートメソッドをパブリックメソッドに昇格させるのは悪い習慣だと思います。また、メソッドをテストするためだけに、メソッドをプライベートから内部に昇格させるのは悪い習慣だと思います。一歩先に進みましょう。テスト プロジェクトに内部メソッドへのアクセスを許可するのは悪い習慣だと思います。私にとって、それはすべて設計上の欠陥の兆候です。それがそれをしない理由だという意味ではありません。意識的な選択である限り、コードの匂いをコードに追加できます。他のすべての場合: プライベート メソッドをごまかしてパブリック メソッドにプロモートする必要がないように、デザインをテスト可能な状態に保ちます。

おそらく単純すぎる例:

public class TheThing
{
    private readonly ISummator _summator;

    public TheThing(ISummator summator)
    {
        _summator = summator;
    }

    public void SomeMethod()
    {
        _summator.SumStuff();
    }
}
于 2013-02-06T10:48:46.623 に答える
1

いいえ、あなたはしません。

メソッドを抽出している間、テストはあなたの背中をカバーするという考えです。いずれにせよ、(リフレクションなしで) プライベート メソッドをテストすることはできません。

を呼び出すメソッドをテストするとGetSumOfNumbers、自動的にテストされます。テストカバレッジツールはこれを確認します。

于 2013-02-06T10:13:44.693 に答える