【问题标题】:How can you use Lazy<> with AutoMock (Moq)如何将 Lazy<> 与 AutoMock (Moq) 一起使用
【发布时间】:2016-06-21 16:25:15
【问题描述】:

我们正在使用 Autofac.Extras.Moq.AutoMock。 现在我有一个使用 Lazy

的构造函数依赖项
public MyService(Lazy<IDependency> myLazyDependency) {...}

要测试MyService,我们需要模拟Lazy&lt;Dependency&gt;

我正在尝试这个

[ClassInitialize]
public static void Init(TestContext context)
{
    autoMock = AutoMock.GetLoose();
}

[TestInitialize]
public void MyTestInitialize()
{
     var myDepMock = autoMock.Mock<Lazy<IDependency>>();  // <-- throws exception
}

这是测试运行器返回的异常:

初始化方法 Tests.MyServiceTests.MyTestInitialize 抛出异常。 System.InvalidCastException:System.InvalidCastException:无法转换类型为“System.Lazy1[IDependency]' to type 'Moq.IMocked1[System.Lazy`1[IDependency]]”的对象..

那么,如何使用 automock 传递 Lazy 模拟对象。

【问题讨论】:

  • 为什么不模拟IDependency,然后传入new Lazy(mockedObj)(或者不管它是内置的——我忘了​​)?没有理由嘲笑Lazy,你不是在测试系统框架。
  • 好主意,但我无法让它工作。您需要传递一个 lambda。不接受 MockedObj。
  • 然后传递类似new Lazy(() =&gt; mockedObj) :)
  • 多哈。忘记类型了。它是 Lazy(() => automockedObject)。非常感谢。如果您将其放入回复中,我会将其标记为答案。

标签: c# moq autofac mstest automocking


【解决方案1】:

您不必模拟Lazy,因为它是框架的一部分(除非有一些极端情况)。您可以简单地模拟 IDependency 并将模拟的对象传递给 Lazy

这样的事情应该可以工作:

var mockDependency = autoMock.Mock<IDependency>();
var mockObject = mockDependency.Object; //(Not entirely sure of the property for this library)
var mockedLazy = new Lazy<IDependency>(() => mockObject);

请注意,这意味着 Lazy 基本上不会为您的测试做任何事情(如果这是一个问题) - 它只会在第一次使用时返回已创建的模拟

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2013-04-19
  • 2011-12-14
相关资源
最近更新 更多