繁体   English   中英

Moq-如何设置一个懒惰的界面

[英]Moq - How to setup a Lazy interface

我想模拟一个惰性接口,还要Setup一个返回false的方法。

问题是,当我运行测试时,出现NotSupportedException:

System.NotSupportedException:'在非虚拟(在VB中可重写)成员上的无效设置:模拟=>模拟值

这是一个简化的示例:

[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时,它将使用模拟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM