c# – 如何在AutoMock(Moq)中使用Lazy <>

我们正在使用Autofac.Extras.Moq.AutoMock.
现在,我使用了Lazy<>的构造函数依赖项.

public MyService(Lazy<IDependency> myLazyDependency) {...}

要测试MyService,我们需要模拟Lazy< Dependency>.

我正在尝试这个

[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]’的对象以键入’Moq.IMocked1 [System.Lazy`1 [IDependency]]’..

那么,我怎样才能传递一个懒惰的<>使用automock模拟对象.

解决方法:

你不需要模拟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基本上不会对您的测试做任何事情(如果这是一个问题) – 它只会在第一次使用时返回已经创建的模拟

上一篇:ASP.NETCore使用AutoFac依赖注入


下一篇:c# – Autofac singleton dispose