1

私はかなり大きなプロジェクトで NHibernate とリポジトリ パターンを使用しており、サービス層の単体テスト戦略を確立しようとしていますが、頭に浮かぶ問題がいくつかあります。単体テストへのアプローチが間違っている可能性があります。また、リポジトリ パターンへのアプローチが間違っている可能性もありますが、どちらが正しいかはわかりません。

私のシナリオの単純化されたサブセットは次のようになります。

public class UserRepository : RepositoryBase, IRepository 
{

   public UserRepository() {}
   public UserRepository( ISession sessionParam ) {
      session = sessionParam;   // member of repository base
   }

   public string GetUsernameFromEmail( string emailAddress ) {
      return session.QueryOver<Members>().List().Where( u => u.EmailAddress.ToLowerInvariant() == emailAdrress.ToLowerInvariant() ).FirstOrDefault().Username;
   }

}

私の単体テストの概念は、NHibernate の ISession を偽造し、テストしようとしているシナリオに適合するユーザーのリストを返すものを渡すことです (たとえば、電子メール アドレスは大文字と小文字を区別しません) (また、これを FakeItEasy で動作させることができますが、それは別の質問です。この道を進む必要があります)。所有していないオブジェクトを偽造してはならないことを念頭に置いて、ISession を偽造したくないという論理を理解できます。また、リポジトリをテストしてはならない方法について多くのことを読んできました。単体テストの場合ははるかに下です。

しかし、この非常に基本的なケースでも、単体テストしたいロジックがリポジトリにあります。他のリポジトリ メソッドには、さらに多くのロジックが含まれる可能性があります (たとえば、データ検証など)。SqlLite などを使用してレポジトリの比較的高速な統合テストを作成できることはわかっていますが、このロジックはユニット テストする必要があるように思えます。

リポジトリに依存して、Asp.Net MVC4 サイトによって消費されている (WCF) サービス層があります。

最善の方法として、WCF 層で単体テストを構築し、テスト用に IRepository を偽装しますが、リポジトリからすべてのユーザーを取得せずにこのロジックをサービス層に移動する方法がわかりません。それらをサービス層に戻しますが、これはばかげているようです。

私の質問は、ここにある全体的なアーキテクチャのどの部分が頭の中で根本的に間違っているのでしょうか?

編集

@ Wiktor-zychla の回答に応えて、ISession を偽造したい理由に関する私の論理を次に示します。この特定のテストについて考えてみると、大文字と小文字が混在する電子メール アドレスと特定のユーザー名を持つ単一のユーザーを常に返す ISession の実装をリポジトリで使用し、すべて小文字の電子メール アドレスを渡し、戻り値を取得したいと考えています。値は、偽物に使用するように指示したユーザー名です。そのようにして、既知の値に対してロジックをテストしています-それが現実の世界でNHibernateがどのように動作するかどうかは、ここでは私の関心事ではありません-リポジトリメソッドでロジックをテストすることです。繰り返しになりますが、これは単純で素朴な例であり、他の多くの方法で解決できることはわかっています。後でテストできるようにしたい、より複雑な機能を代用しているだけです。

4

1 に答える 1