C# 使用moq进行测试存储库查询

C# 使用moq进行测试存储库查询,c#,moq,C#,Moq,Iam正在为我的存储库编写单元测试,我需要使用委托测试存储库方法 首先是来自存储库接口的部分 public interface IRepository<T> { ... IQueryable<T> All(); ... } 表达式引用不属于模拟对象的方法:c=>c.All()。其中(r=>((r.BeginningDate.requestTerminationDate)和&r.TerminationDate.reqestStartDate)|((

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

首先是来自存储库接口的部分

public interface IRepository<T>
{
    ...
    IQueryable<T> All();
    ...
}
表达式引用不属于模拟对象的方法:c=>c.All()。其中(r=>((r.BeginningDate.requestTerminationDate)和&r.TerminationDate<.requestTerminationDate)| | r.BeginningDate>.reqestStartDate)|((r.TerminationDate>=.requestTerminationDate和&r.BeginningDate>.reqestStartDate)&r.开始日期<.请求终止日期))


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

只需
设置
IRepository.All()
即可返回
IQueryable
并断言被测单元正在做它应该做的事情。请注意,按照传统的定义,您正在尝试存根存储库,并且您将断言该状态。

编辑代码并添加换行符,使其不具有水平滚动。所有这些代码都很难读懂。我将stub All()转换为IQueryable()(即
.Returns(rentDetailsCollection.ToQueryable())
)返回一个伪数据列表。如果您需要像您一样跳转来设置单元测试,那么就会出现一些错误。我不会验证该方法是否调用数据源上的所有这些方法。这很乏味,而且会让你在长期的错误中完全停止测试,因为它需要维护太多的工作。(续):如果你按照我的建议设置了测试,你只需要测试方法的结果。如果该方法所做的只是将调用的结果返回到存储库,则无需测试该方法。测试存储库返回的IQueryable的方法。如果它返回您的ORM(如EF)返回的内容,则根本不要测试它。这超出了您的应用程序代码。谢谢回复。基本上,我正在尝试使用DateSexists()测试Room的AnyIntersectionForRoom方法(因为查询逻辑)。您的All和AsQueryable提示帮助。编辑您的代码并添加换行符,使其不具有水平滚动。所有这些代码都很难读懂。我将stub All()转换为IQueryable()(即
.Returns(rentDetailsCollection.ToQueryable())
)返回一个伪数据列表。如果您需要像您一样跳转来设置单元测试,那么就会出现一些错误。我不会验证该方法是否调用数据源上的所有这些方法。这很乏味,而且会让你在长期的错误中完全停止测试,因为它需要维护太多的工作。(续):如果你按照我的建议设置了测试,你只需要测试方法的结果。如果该方法所做的只是将调用的结果返回到存储库,则无需测试该方法。测试存储库返回的IQueryable的方法。如果它返回您的ORM(如EF)返回的内容,则根本不要测试它。这超出了您的应用程序代码。谢谢回复。基本上,我正在尝试使用DateSexists()测试Room的AnyIntersectionForRoom方法(因为查询逻辑)。你的所有提示和询问都有帮助。这就是方法。我倾向于在我的单元测试项目中保留一个伪造的位置:I位置,所以我只需要做一次。它在构造函数中使用哈希集,因此编写测试非常方便。这是一种方法。我倾向于在我的单元测试项目中保留一个伪造的位置:I位置,所以我只需要做一次。它在构造函数中使用哈希集,因此可以尝试编写测试。
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> 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)
};
[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