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
被调用时,它将使用模拟。
我想模拟一个 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
被调用时,它将使用模拟。