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

时间:2014-04-05 14:13:53

标签: 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. 它的可读性较低(imho)
  2. 它迫使我混合使用新旧语法。
  3. 我更喜欢使用类似

    的东西设置现有模拟
    existingMock.SetupUsingNewSyntax(m => m.GetSomeValue() == value);
    
    • 这可能吗?
    • 如果不是,是否在路线图上?
      我会假设为现有的模拟引入了新的语法。
    • 如果不是,我怎么能自己实现呢?

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

      

    Moq也是目前为止提供Linq的第一个也是唯一一个框架   模拟,使上述相同的行为可以实现更多   succintly

    由于现在有两种方法可以创建和设置一个新的模拟方法,旧的方式和新的 succint 方式,我希望它可以继续使用,还包括设置现有< / em>模拟。

1 个答案:

答案 0 :(得分:1)

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

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