如何在最小起订量中使用 lambda 语法设置现有模拟

本文关键字:语法 lambda 设置 模拟 | 更新日期: 2023-09-27 17:57:04

Moq 中有一种新的语法,允许我

使用
var newMock = Mock.Of<IInterface>(m => m.GetSomeValue() == value);

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

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

我不喜欢这个有两个原因

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

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

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

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

Moq 也是迄今为止第一个也是唯一一个为 Linq 提供 模拟,以便可以更多地实现上述相同行为 简洁明了

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

如何在最小起订量中使用 lambda 语法设置现有模拟

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

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