1

私はいくつかのコードの単体テストを書くことと戦ってきました、そして私はこれに苦労しています:

オーバーロードしたメソッドがあり、次のようになります。

 Public Client GetClient(int productID)
 {
  //Some sql that evaluate a client

  if(!GetClient(clientRef,ClientTypeRef))
   Return Client.UnknownClient;
    //some other sql and codes
  Return Client.CustomerClient;
  }

問題は、これにどのようにアプローチするかです。私のテストでは、にモックを追加しGetClient(clientRef,ClientTypeRef)、OKクライアント(以外のものClient.UnknownClient)を返して続行できるようにしましたが、null参照を取得していますか?そのようなメソッドをモックしてテストすることは可能ですか、そしてこれをどのように続行しますか?

4

2 に答える 2

2

単体テストが非常に一般的になった理由の 1 つは、SOLID 設計原則を奨励することが示されたからです。

あなたが含めた小さなコードに基づいて、あなたの問題は、GetClient(int productID)責任が多すぎるため、それらを個別にテストするのに苦労しているという事実に起因する可能性があると思います。

私の理解では、あなたは:

  • DB からクライアントをロードする (製品 ID による?)
  • (データベースへのより多くのクエリを含む複雑なロジックで?)クライアントの種類を確認します

その下のすべての論理パスをテストできるようにモックするのではなく、GetClient(clientRef,ClientTypeRef)(可能であれば) コードをリファクタリングして、クライアントの読み込みをクライアントの型のチェックから分離することをお勧めします。の下にグループ化するロジック//some other sql and codes

これにより、すべての部分を個別にテストしやすくなりますが、何よりもコードをより保守しやすくなります。

于 2012-12-14T10:13:55.630 に答える
1

どのモック フレームワークを使用していますか?

私はmoqを使用します。このメソッドをモックするには、次のようにします

 _mockClientRepository.Setup(x => x.GetClient(It.IsAny<int>(),It.IsAny<int>())).Returns(Client.CustomerClient);

基本的にこれは、メソッドに渡される整数は常に Client.CustomerClient を返すことを意味します。

于 2012-12-14T09:24:56.303 に答える