モッキング.Nettiers DatarePository Call
質問
.nettiers生成コードをDALとして使用しているプロジェクトがあります。
現時点では、私のテストは、各テストのデータベース内のテストデータを物理的にセットアップし、Nettiersオブジェクトがデータベースにヒットして必要に応じて戻ることで構成されています。
明らかに、これは特に効率的ではありませんが、これまでのところ、250の奇数テストで実行に約10分かかるため、テストにモッキングを追加することを検討しています。
データベース呼び出しをモックアウトするという概念を理解していると確信していますが、データベースにかなり強く結合されているため、特にネットに適用するのに苦労しています。
私がテストしたい方法の1つは、このように見えます(Brevityのためにわずかに削減されます):
public class InterfaceManagerService
{
public DataDocument SaveDataDocument(DataDocument entity)
{
var lookupEntity = DataRepository.DataDocumentProvider.GetByDocumentId(entity.DocumentId);
if (lookupEntity == null)
{
File fileEntity = new File();
fileEntity.Name = entity.Name;
var savedFileEntity = DataRepository.FileProvider.Save(fileEntity);
entity.FileId = savedFileEntity.FileId;
var savedEntity = DataRepository.DataDocumentProvider.Save(entity);
return (savedEntity);
}
}
}
現在、私はTypeMockの試用版を使用しています。それは必要なことをしているように見えるからですが、私は特にオープンソースのものに対して開かれています。
InterfaceManagerservice、またはDatarePository、またはエンティティ自体の模擬インスタンスを作成する必要がある場合、私がワークアウトする最初の問題(Nettiersエンティティには役立つ可能性のあるインターフェイスがあります)。
2番目の問題は、Nettiersが予想される各オブジェクトの偽のインスタンスを作成した場合に大規模で逆にテストすることになるエンティティに多数の追加プロパティを配置するため、返される偽のオブジェクトを作成する方法です。
最終的には、Nettiersデータリポジトリメソッドを使用する方法のユニットテストを作成するための最良の方法でいくつかの方向を探していますが、現在インターネット上でそれについてはあまりないように見えるので、データベースにヒットしないようにしています。
解決
私は私の個人的な経験から派生したいくつかの提案をします。これらはあなたの懸念のすべてに対処するわけではないかもしれませんが、少なくとも彼らがあなたに助けてくれることを願っています。
Rhino Mocksは、かなり有名なモッキングフレームワークです。 TypeMockの代替品を探しているなら、私はそれを提案することをお勧めします。
InterfaceManagerserviceまたはDatarePositoryをmock笑するかどうかについては、テストしようとしているものに依存すると思います。 InterfaceManagerserviceをテストしますか?次に、datarepository.fileproviderおよびdataRepository.datadocumentProvider用のモックオブジェクトを作成します。 「依存噴射」の概念にまだ精通していない場合は、それを調べてください。 InterfaceManagerserviceクラスに依存関係の注入を適用する必要があるようです(ユニットテストしたいと仮定して)。
InterfaceManagerserviceを消費する単位テストコードを使用する場合は、InterfaceManagerserviceをmock笑してください。
... Nettiersは、予想される各オブジェクトの偽のインスタンスを作成すると、大規模で控えめにテストするエンティティに多くの余分なプロパティを配置するため、返される偽のオブジェクトを作成する方法。
単一のユニットテストを書くのは簡単です。カバーする必要があるすべてのシナリオをカバーするための多くの単体テストを作成し、特にテスト対象の方法の入力と出力がテストされている場合、ユニットテストを通して多くのコードが複製されない効率的な方法でそうすることは困難です。複雑です。
このためには、私の個人的なアプローチは、多くのコードの複製を避けるためにテスト初期化ロジックとテスト検証ロジックを統合しようとすることであると言う以外に、あまりガイダンスがありませんが、同時に、作成を避けようとすることを試みますユニットテストコード自体は非常に複雑であるため、理解が困難になり、バグが生息しやすくなりました。
一般に、テストロジックを入力/初期化、期待、結果/検証の3つのカテゴリに分割することになっていると思います。これらの3つのカテゴリにロジックを入力することは、単体テスト全体で共通のコードを統合できるという点で役立つことがわかりました。
頑固なテスト駆動型開発の支持者は、クリーンな一連の単体テストコードを作成するのに苦労することは、アプリケーションの設計上の欠陥の兆候であるとおそらく言うでしょう。私はそれに反対するつもりはありませんが、残念ながら、私が関与してきたプロジェクトは、一般的に単純で完全に包括的な単体テストコードベースを作成していないと言うでしょう。単純な単位テストでは、一般に問題のあるシナリオを実際には検討しておらず、包括的な単体テストでは一般に、多くのテストセットアップロジックが必要でした。
他のヒント
私はTypeMockを使用していますが、とても気に入っています。クラスの内部をock笑するのは本当に簡単です。私がやりたいことは、DatarePositoryクラスをオーバーライドし、TypeMockがそれを消費しているコンポーネントに期待される結果を返して、コンポーネントが期待どおりに機能することを確認することです。
しかし、実際には、それはあなたがテストしているものに依存します。サービスをテストしている場合は、データリポジトリを偽造し、予想される結果を返します。リポジトリをテストしている場合は、リポジトリが消費する内部を偽造します。したがって、テストしているコンポーネントへの外部参照を偽造することです。
Hth。