如何在C#

时间:2019-04-02 05:54:34

标签: c# moq

我正在使用moq编写linq表达式的单元测试

我的linq表达式根据诸如employeeid和活动记录之类的条件获取雇员列表。

这是我的linq表情

employeess.Get(x => x.EmployeeId == employeeId && x.Active == 1).FirstOrDefault();

我已经设置了以下通用表达式来模拟员工列表。

mockrepo.Setup(x => 
  x.Get(
    It.IsAny<Expression<Func<Employee, bool>>>(), 
    It.IsAny<Func<IQueryable<Employee>, 
    IOrderedQueryable<Employee>>>(), 
    It.IsAny<string>()
    )
).Returns(employeeList.AsQueryable());

我想编写单元测试以根据条件获取employeelist。如何用条件模拟linq表达式

3 个答案:

答案 0 :(得分:0)

Moq不支持Expression函数,因此这是最好的解决方案。使用此nuget软件包Moq.Expression

// import namespace
using MoqExpression;

// you should do like this it will work
mockrepo.Setup(x => x.SearchFor(MoqHelper.IsExpression<Employee>(s => s.Name.Equals("Test")))).Returns(employeeList.AsQueryable());

有关更多文档:click here

答案 1 :(得分:0)

您有几种选择:

  1. 使用内存中的ORM(如果一个用于Active Record)或对象的内存中集合。
  2. 将Active Record类公开为Active Record接口,模拟接口方法,并向使用它的类提供模拟接口。

通常,永远不会嘲笑表达式,因为它们是业务逻辑的一部分。主要的模拟建议基于应用程序体系结构。

答案 2 :(得分:0)

如果可能的话,我建议进行一些重新设计:您应该在Get上删除谓词参数,因为在返回IQueryable时,以后可以定义诸如“仅获取活动记录”之类的条件。

代替

employeess.Get(x => x.EmployeeId == employeeId && x.Active == 1).FirstOrDefault();

您的代码将变为

employees.Get().FirstOrDefault(x => x.EmployeeID == employeeId && Active == 1);

现在,您只需返回employeeList.AsQuerable()就可以更轻松地模拟Get()。