使用moq测试存储库查询

本文关键字:查询 存储 测试 moq 使用 | 更新日期: 2023-09-27 18:26:36

我正在为我的存储库编写单元测试,我需要用委托测试存储库方法。

首先部分来自存储库接口

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

这是我想要测试的方法。我这样做是作为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));
        }

在我的单元测试中,我创建了一个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)
};

但是我有一个问题,如何设置存储库moq?我尝试了以下

[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

表达式引用了一个不属于模拟对象的方法:c=>c.All()。其中(r=>(((r.BeginningDate<=.requestStartDate&&r.TerminationDate>.requestTerminationDate)&amp;r.TerminationDate<requestTerminationDate)|| r.BeginningDate>.requestStartDate)||((r.TerminationDate>=.requestTerminationDate&&r.BeginingDate>.requestStartDate)&amp;r.BeginningDate<requestTerminationDate))

使用moq测试存储库查询

Setup IRepository.All()返回一个IQueryable<T>,并断言被测单元正在做它应该做的事情。请注意,根据传统的定义,您正在尝试Stub存储库,并且您将断言状态。