3

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<>()and Mock.Of<>(),以及 mocks 和 mock 对象是如何相关的。

Moq 也是迄今为止第一个也是唯一一个向 Mocks 提供 Linq 的框架,因此可以更简洁地实现上述相同的行为

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

4

1 回答 1

1

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

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

于 2014-09-01T03:54:58.130 回答