2012-03-03 12 views
2

私のリポジトリのIam書き込みユニットのテストで、デリゲートを使ってリポジトリメソッドをテストする必要があります。moqを使ったリポジトリクエリのテスト

ここにリポジトリのインターフェイスからすべての部分の第

public interface IRepository<T> 
{ 
    ... 
    IQueryable<T> All(); 
    ... 
} 

と私がテストしたいものの方法があります。私はIEnumerable<RentDetails>コレクション

IEnumerable<RentDetails> rentDetailsColection = new List<RentDetails> 
{ 
new RentDetails(TenantTestHelper.ValidTenant,roomMoq, new DateTime(2012, 1, 1),new DateTime(2012, 2, 1)), 
new RentDetails(TenantTestHelper.ValidTenant,roomMoq, new DateTime(2012, 3, 1),new DateTime(2012, 7, 1)), 
new RentDetails(TenantTestHelper.ValidTenant,roomMoq, new DateTime(2012, 10, 1),DateTime.MaxValue) 
}; 

を作成し、私のユニットテストでIRepository<RentDetails>

public static bool AnyIntersectionForRoomWithDatesExists 
(this IRepository<RentDetails> repository, Room room, DateTime startDate, 
DateTime terminationDate) 
{ 
var rent = repository.All().Where(
r => 
(r.BeginningDate <= startDate && r.TerminationDate > terminationDate && 
      r.TerminationDate < terminationDate) || 
(r.BeginningDate > startDate) || 
(r.TerminationDate >= terminationDate && r.BeginningDate > startDate && 
      r.BeginningDate < terminationDate)); 
     } 

ための拡張メソッドとしてそれを行うが、私は、セットアップのリポジトリMOQをする方法に問題がありますか?ここで、(C => c.All():私は、次の

[Test] 
var reqestStartDate = new DateTime(2012, 4, 1); 
var requestTerminationDate = reqestStartDate.AddDays(30); 

... 

rentDetailsRepositoryMoq.Setup(c => c.All().Where(r => 
(r.BeginningDate <= reqestStartDate && 
r.TerminationDate > requestTerminationDate && 
r.TerminationDate < requestTerminationDate) || 
(r.BeginningDate > reqestStartDate) || 
(r.TerminationDate >= requestTerminationDate && 
r.BeginningDate > reqestStartDate && 
r.BeginningDate < requestTerminationDate))) 
.Returns((IQueryable<RentDetails>)rentDetailsColection 
.Where(r =>(r.BeginningDate <= reqestStartDate && 
r.TerminationDate > requestTerminationDate && 
r.TerminationDate < requestTerminationDate) || 
(r.BeginningDate > reqestStartDate) || 
(r.TerminationDate >= requestTerminationDate && 
r.BeginningDate > reqestStartDate && r.BeginningDate < requestTerminationDate))); 

をしようと試みたが、私は例外

NotSupportedException 

Expressionが嘲笑オブジェクトに属していない方法を参照して持っていますR =>(((r.BeginningDate < = .reqestStartDate & & r.TerminationDate> .requestTerminationDate)& & r.TerminationDate < .requestTerminationDate)|| r.BeginningDate> .reqestStartDate)||((r.Termi nationDate> = .requestTerminationDate & & r.BeginningDate> .reqestStartDate)& & r.BeginningDate < .requestTerminationDate))

+0

コードを編集して改行を追加すると、水平スクロールが行われません。そのコードはすべてそのように読むのは難しいです。 – gideon

+1

私はIQueryable()に変換された偽のデータのリストを返すだけで、All()をスタブしていました( '.Returns(rentDetailsColection.ToQueryable())))。あなたが何か間違ったことがあるようにユニットテストをセットアップするためにフープを飛び越える必要がある場合。このメソッドがデータソース上のすべてのメソッドを呼び出すかどうかは検証しません。面倒で、長い間間違ってテストを中止することになります。これは、保守があまりにも多くの作業であるためです。 –

+1

(続き):私が示唆しているようにテストをセットアップした場合は、そのメソッドの結果をテストするだけで済みます。すべてのメソッドが呼び出しの結果をリポジトリに返すのであれば、メソッドをテストする必要はありません。代わりにリポジトリが返すIQueryableのメソッドをテストします。あなたのORM(EFのような)が返すものがあれば、それをまったくテストしないでください。それはあなたのアプリケーションコードの外です。 –

答えて

4

だけSetupIRepository.All()IQueryable<T>を返すと、テスト中のユニットは、それが何であるかをやっていることを主張しますやっているはずです。従来の定義では、リポジトリをスタブしようとしており、その状態をアサートすることに注意してください。

+0

これはこれを行う方法です。私はFakeRepositoryを維持する傾向があります:IRepository 私のユニットテストプロジェクトでは、これは一度だけ行う必要があります。コンストラクタでHashset が必要になりますので、テストを書くのに時間がかかります。 – Frans

関連する問題