我正在使用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表达式
答案 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)
您有几种选择:
通常,永远不会嘲笑表达式,因为它们是业务逻辑的一部分。主要的模拟建议基于应用程序体系结构。
答案 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()。