9

私のFooクラスには次のものがあるとします。

readonly IService service;

public Foo(IService service) 
{
    if (service == null)
        throw new ArgumentNullException("service");

    this.service = service;
}

public void Start()
{
    service.DoStuff();
}

ArgumentNullExceptionこれまでのところ、null を渡してがスローされることを確認するコンストラクターの単体テストが 1 つあります。IService有効な値を渡し、それが設定されていることを確認するコンストラクターの 2 番目の単体テストthis.serviceが必要ですか (パブリック アクセサーが必要になります)。

それとも、Startこのコード パスをテストするメソッドの単体テストに頼るべきでしょうか?

4

2 に答える 2

12

設定は実装の詳細であるため、期待される場所で使用されていることをテストし、メソッドthis.serviceを介してこれをテストする必要があります。Startテストが脆弱にならないようにします。

サービスが適切に使用されていることをテストするだけです。保管方法は気にしなくていいです。

于 2013-04-01T20:49:03.343 に答える
10

コンストラクターが機能しない場合、他のテストは成功しないため、これらのテストは冗長です。

正直なところ、コンストラクターにこれらの null チェックを記述することさえ気にしません。理由は簡単です: DI コンテナーでは、null 参照を使用してコンストラクターを自動配線することはできません (少なくとも、デフォルトではそうではありません)。したがって、型が null 値を使用して構築される可能性はありません (コンテナーによって自動配線された場合) . そのため、コード カバレッジを高くしたいときに無駄なテストを追加する無駄なコードが追加されるだけです。

これらの null チェックを完全にスキップして、DI コンテナーを信頼する (または信頼できる DI コンテナーを選択する) ことをお勧めします。

于 2013-04-01T21:30:30.537 に答える