【发布时间】:2022-01-12 08:53:42
【问题描述】:
我在尝试正确模拟封装在 Lazy 类中的任意接口时遇到了困难。
我试过了:
[TestClass]
public class MyFooServiceTests
{
private Mock<Lazy<IFoo>> _lazyFooMock = new Mock<Lazy<IFoo>>();
private Mock<IFoo> _fooMock = new Mock<IFoo>();
private MyFooService _service;
[TestMethod]
public void FooMethod_HappyPath_ShouldReturn()
{
//Arrange
_fooMock
.Setup(x => x.DoSomething())
.Returns(1);
_lazyFooMock
.SetupGet(x => x.Value)
.Returns(_fooMock.Object); // --------> Throws Exception.
_service = new MyService(_lazyFooMock.Object);
}
}
public interface IFoo
{
int DoSomething();
}
public class MyFooService
{
public MyFooService(IFoo foo) { ... }
}
异常消息:
不支持的表达式:x => x.Value 不可覆盖的成员(此处:Lazy.get_Value)不得用于设置/验证表达式。
起订量:4.16.1
【问题讨论】:
-
您不能在使用 Moq 时模拟非虚拟成员。
Lazy<T>.Value不是虚拟的,因此无法模拟。 -
你为什么要模拟
Lazy<T>?只需创建一个新的Lazy<IFoo>,它会返回_fooMock.Object -
大家好,谢谢你的提示,看看答案
标签: c# unit-testing moq .net-4.6.2