问题描述
我不确定如何在Moq中将参数从Setup()传递给Return()。
这里是一个例子:
public static IInterfaceHandler GetInterfaceHandlerMoq()
{
// Defining the moq
var moq = new Mock<IInterfaceHandler>();
// Trying to set up a moq using another moq
moq.Setup(m => m.CreateCommunicationInterface(It.IsAny<Guid>(),It.IsAny<string>()))
.Returns((Guid guid,string value) => GetProgrammerMoq(guid,value));
// Return mocked object
return moq.Object;
}
请注意,GetProgrammerMoq()是一个将返回另一个Moq的库。这是代码:
public static IProgrammer GetProgrammerMoq(Guid guid,string instName)
{
// Create Moq
var moq = new Mock<IProgrammer>();
// Set up the returnables
moq.Setup(o => o.InstanceName).Returns(programmer + "_" + instName);
moq.Setup(o => o.Guid).Returns(guid);
// Return mocked object
return moq.Object;
}
这里看到GetProgrammerMoq()需要根据传递给CreateCommunicationInterface()的内容来设置其参数。
然后我的测试尝试获取和使用Moq,但是“ p”返回为null(因为我想我的参数没有正确传递给Return())。
这是测试外观的草稿:
[Fact]
public void DoSomething()
{
IInterfaceHandler test = ProgrammerMoqs.GetInterfaceHandlerMoq();
Guid? g = new Guid();
IProgrammer p = test.CreateCommunicationInterface(g,"test-boff");
...
}
解决方法
尝试一下:
var moq = new Mock<IInterfaceHandler>(MockBehavior.Strict);
MockBehavior.Strict:如果从Mock获得NULL,则始终尝试MockBehavior.Strict。如果未准备好某些设置,默认情况下Moq将返回NULL。但是使用MockBehavior.Strict,它将引发异常。如果没有适当的设置,则每次尝试从模拟对象调用任何东西的尝试都会抛出。
如果尝试MockBehavior.Strict时遇到异常,则表示:
.Setup(m => m.CreateCommunicationInterface(It.IsAny<Guid>(),It.IsAny<string>()))
未能捕获提示,因此该模拟默认情况下返回NULL。
为什么它无法捕获调用?有几种选择:
- CreateCommunicationInterface可能过载,并且您的设置与另一个您没有想到的过载匹配
- 过滤器(It.IsAny ..)与实际参数不匹配
- (..)
KlausGütter在评论中指出了Guid
和Guid?
的区别。实际上,通过测试时,您使用的过滤器是It.IsAny():
Guid? g = new Guid();
g
不是Guid
类型的对象,它是Nullable<Guid>
,因此寻找任何Guid
的过滤器不匹配。因为表达式It.IsAny<Guid>()
的结果适合该方法想要的Guid?
,但是类型仍然不匹配,因此编译了代码。
如果尝试使用It.IsAny
moq.Setup(m => m.CreateCommunicationInterface(It.IsAny<Guid?>(),It.IsAny<string>()))
.Returns((Guid? guid,string value) => GetProgrammerMoq(guid,value));