Moq - 如何设置惰性界面

Moq - How to setup a Lazy interface

我想模拟一个 Lazy Interface 以及 Setup 一个 return false 的方法。

问题是,当我 运行 测试时,我得到一个 NotSupportedException:

System.NotSupportedException: 'Invalid setup on a non-virtual (overridable in VB) member: mock => mock.Value

这是一个简化的例子:

[TestMethod]
public void SomeTestMethod()
{
    var someService = new Mock<Lazy<IService>>();

    /*this line throws the exception*/  
    someService.Setup(x => x.Value.SomeMethod()).Returns(false);
    ...
}

请考虑 SomeMethod 实际上是虚拟的,但是 Moq 不支持使用 x.Value 进行延迟初始化。

我没有找到针对这个特定场景的解决方案,但我确实查看了一些其他的声明方法,但遗憾的是对我不起作用。

[TestMethod]
public void SomeTestMethod()
{
    var someService = new Mock<IService>();
    var lazySomeService = new Lazy<IService>(() => someService.Object);

    //tried this but won't compile
    //lazySomeService.Setup(x => x.Value.SomeMethod()).Returns(false);
    //lazySomeService.Value.Setup(x => x.SomeMethod()).Returns(false);
    ...
}

您从

开始走上了正确的道路
var someService = new Mock<IService>();
var lazySomeService = new Lazy<IService>(() => someService.Object);

但设置需要模拟而不是实际的 Lazy 实现。

someService.Setup(x => x.SomeMethod()).Returns(false);

这样当 Lazy.Value 被调用时,它将使用模拟。