私は、単体テストに重点を置いて作成されたかなり最新のプロジェクトを見ていました。「オブジェクト指向プログラミングのすべての問題は、新しい間接層を導入することで解決できる」という古い格言に従って、このプロジェクトは複数層の間接層を誇示していました。副作用は、かなりの量のコードが次のようになることでした。
public bool IsOverdraft)
{
balanceProvider.IsOverdraft();
}
現在、単体テストと高いコード カバレッジの維持に重点が置かれているため、コードのすべての部分にそれに対して書かれた単体テストがありました。したがって、この小さなメソッドには 3 つの単体テストが存在します。それらはチェックします:
- balanceProvider.IsOverdraft() が true を返す場合、IsOverdraft は true を返す必要があります
- balanceProvider.IsOverdraft() が false を返す場合、IsOverdraft は false を返す必要があります
- balanceProvider が例外をスローした場合、 IsOverdraft は同じ例外を再スローする必要があります
さらに悪いことに、使用されているモッキング フレームワーク (NMock2) は、次のようにメソッド名を文字列リテラルとして受け入れました。
NMock2.Expect.Once.On(mockBalanceProvider)
.Method("IsOverdraft")
.Will(NMock2.Return.Value(false));
それは明らかに「赤、緑、リファクタリング」ルールを「赤、緑、リファクタリング、テストで名前を変更、テストで名前を変更、テストで名前を変更」にしました。Moq のような別のモック フレームワークを使用すると、リファクタリングに役立ちますが、既存のすべての単体テストを一掃する必要があります。
この状況を処理する理想的な方法は何ですか?
A) レイヤーのレベルを小さくして、これらの転送呼び出しが発生しないようにします。
B) ビジネス ロジックが含まれていないため、これらの転送方法をテストしないでください。カバレッジのために、それらすべてを ExcludeFromCodeCoverage 属性でマークしました。
C) 戻り値や例外などをチェックせずに、適切なメソッドが呼び出されたかどうかのみをテストします。
D) やめて、テストを書き続けてください ;)