【问题标题】:How to set up an existing mock using lambda syntax in Moq?如何在 Moq 中使用 lambda 语法设置现有模拟?
【发布时间】:2014-04-05 14:13:53
【问题描述】:

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&lt;&gt;()Mock.Of&lt;&gt;(),以及模拟和模拟对象之间的关系。

Moq 也是迄今为止第一个也是唯一一个提供 Linq 的框架 模拟,以便可以实现更多相同的行为 简明扼要

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

【问题讨论】:

  • 您可以使用Mock.Get&lt;T&gt; 获取模拟实例。
  • 是的,我知道。但我的问题是,我是否可以使用上面显示的 lambda 语法对其进行配置?
  • Mock.Of&lt;T&gt; 创建一个新的模拟实例。它不适用于AutoMoqCustomization,因为它在内部为您创建了一个模拟实例,并且两个模拟实例将不相同。
  • 是的,我明白了。我想知道是否有一种方法可以通过现有的模拟来使用这种不错的语法。或者也许可以用某种方式编写我自己的 Setup() 方法来接受这种论点。
  • @NikosBaxevanis,也许我的问题的背景尚不清楚。我现在试图澄清它。

标签: c# unit-testing moq autofixture automoq


【解决方案1】:

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

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

【讨论】:

  • 效果很好!您是否考虑过使用此代码为 Moq 编写补丁?如果没有,你介意我做吗?
  • @MEMark 欢迎您发布补丁。另外,我想再讲一个案例为什么我们需要这个补丁。
  • new Mock&lt;IFoo&gt;{ DefaltValue = DefaultValue.Mock }.Of(x =&gt; x.Bar() == "Baz" ); 如上面的代码,我们可以使用 Of 方法和 DefaultValueDefaultValue.Mock 的 Lambda 表达式来设置模拟。您可能知道,使用原始的Mock.Of&lt;T&gt; 方法,我们只设置了一个模拟,其DefaultValueDefaultValue.Empty
猜你喜欢
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多