为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 C# 中模拟 linq 表达式

如何在 C# 中模拟 linq 表达式

C#
收到一只叮咚 2022-11-21 21:46:03

我正在使用 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());

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


查看完整描述

3 回答

?
繁星点点滴滴

TA贡献1526条经验 获得超3个赞

Moq 不支持 with 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());

更多文档:点击这里


查看完整回答
反对 回复 2022-11-21
?
12345678_0001

TA贡献1507条经验 获得超5个赞

您有几种选择:

  1. 使用内存中的 ORM(如果一个用于 Active Record)或内存中的对象集合。

  2. 将 Active Record 类公开为 Active Record 接口、模拟接口方法并将模拟接口提供给使用它的类。

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


查看完整回答
反对 回复 2022-11-21
?
幕布斯7119047

TA贡献1491条经验 获得超8个赞

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

代替

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

你的代码会变成

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

现在模拟 Get() 变得更加容易,因为您只需要返回 employeeList.AsQuerable()。


查看完整回答
反对 回复 2022-11-21
  • 3 回答
  • 0 关注
  • 8 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信