私のリポジトリの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))
コードを編集して改行を追加すると、水平スクロールが行われません。そのコードはすべてそのように読むのは難しいです。 – gideon
私はIQueryable()に変換された偽のデータのリストを返すだけで、All()をスタブしていました( '.Returns(rentDetailsColection.ToQueryable())))。あなたが何か間違ったことがあるようにユニットテストをセットアップするためにフープを飛び越える必要がある場合。このメソッドがデータソース上のすべてのメソッドを呼び出すかどうかは検証しません。面倒で、長い間間違ってテストを中止することになります。これは、保守があまりにも多くの作業であるためです。 –
(続き):私が示唆しているようにテストをセットアップした場合は、そのメソッドの結果をテストするだけで済みます。すべてのメソッドが呼び出しの結果をリポジトリに返すのであれば、メソッドをテストする必要はありません。代わりにリポジトリが返すIQueryableのメソッドをテストします。あなたのORM(EFのような)が返すものがあれば、それをまったくテストしないでください。それはあなたのアプリケーションコードの外です。 –