c# - 如何在 Moq 中使用 lambda 语法设置现有模拟?

标签 c# unit-testing moq autofixture automoq

Moq 中有一个新语法这让我可以使用

从头开始​​创建模拟
var newMock = Mock.Of<IInterface>(m => m.GetSomeValue() == value);

有时我不会自己创建模拟(例如,当使用 AutoData Theories 时)。然后我必须使用旧语法设置模拟

existingMock.Setup(m => m.GetSomeValue()).Returns(value);

我不喜欢这个有两个原因

  1. 可读性较差(恕我直言)
  2. 它迫使我混合使用新旧语法。

我更愿意使用类似的东西来设置现有的模拟

existingMock.SetupUsingNewSyntax(m => m.GetSomeValue() == value);
  • 这可能吗?
  • 如果没有,是否在路线图上?
    我假设也会为现有模拟引入新语法。
  • 如果不是,我该如何自己实现?

我已经知道如何使用 Mock.Get<>()Mock.Of<>() ,以及模拟对象和模拟对象之间的关系。

Moq also is the first and only framework so far to provide Linq to Mocks, so that the same behavior above can be achieved much more succintly

因为现在有两种方法可以创建和设置新模拟,旧方法和新简洁方法,我希望它能继续下去,还包括设置现有 模拟。

最佳答案

我已将解决方案代码上传到my Gist .简而言之,要点代码刚刚删除了从原始代码创建模拟实例的逻辑。为此,我需要访问 MockQueryable<T>类是内部类,所以我使用了 .NET 反射。

要避免反射代码,可以复制MockQueryable<T>的代码从 Moq 源代码到您的测试代码,以及与 MockQueryable<T> 相关的一些内部类型如果需要的话。

关于c# - 如何在 Moq 中使用 lambda 语法设置现有模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22882004/

相关文章:

c# - 为什么成员字段不能有字段初始值设定项调用成员函数?

xcode - 如何在不阻塞主线程的情况下在 Xcode、单元测试中执行延迟?

async-await - 如何在模拟的异步方法上设置可验证的期望?

c# - 如何使用 LINQ 从通用列表中获取下一个合适的值?

c# - 您如何处理 SqlConnection 中的传输级错误?

c# - 何时使用 LINQ 的 .ToList() 或 .ToArray()

asp.net - 如何对 HttpContext.Current.Server.MapPath 进行单元测试

c# - 数据驱动测试的类/模式感知测试数据生成策略

c# - 用最小起订量模拟静态属性

asp.net - Moq Parent 没有默认构造函数。默认构造函数必须显式定义