Moq 中有一种新的语法,允许我
使用var newMock = Mock.Of<IInterface>(m => m.GetSomeValue() == value);
有时我不会自己创建模拟(例如,在使用AutoData Theory时)。然后我必须使用旧语法设置模拟
existingMock.Setup(m => m.GetSomeValue()).Returns(value);
我不喜欢这个有两个原因
- 可读性较差(恕我直言)
- 它迫使我混合新旧语法。
我更愿意使用类似的东西设置现有的模拟
existingMock.SetupUsingNewSyntax(m => m.GetSomeValue() == value);
- 这可能吗?
- 如果没有,是否在路线图上?
我假设也会为现有的模拟引入新语法。 - 如果没有,我该如何自己实现?
我已经知道如何使用 Mock.Get<>()
和 Mock.Of<>()
,以及模拟和模拟对象是如何相关的。
Moq 也是迄今为止第一个也是唯一一个为 Linq 提供 模拟,以便可以更多地实现上述相同行为 简洁明了
由于现在有两种方法可以创建和设置新的模拟,旧方法和新的简洁方式,我希望它能延续下去,还包括设置现有的模拟。
我已将解决方案代码上传到我的 Gist。简而言之,gist 代码刚刚从原始代码中删除了创建模拟 instanc 的逻辑。为此,我需要访问内部类的MockQueryable<T>
类,因此我使用了 .NET 反射。
为了避免反射代码,您可以将 Moq 源代码中的MockQueryable<T>
代码复制到测试代码中,如果需要,还可以复制一些与MockQueryable<T>
相关的内部类型。