我不确定如何在 Moq 中将参数从 Setup() 传递到 Returns()。
下面是一个例子:
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() 的内容设置其参数。然后我的测试尝试获取和使用最小起订量,但“p”返回为空(因为,我猜,我的参数没有正确传递给 Returns())。
这是测试的草稿:
[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。为什么它无法捕获调用?有几种选择:
Klaus Gütter 在评论中指出
Guid
的差异和 Guid?
.事实上,您使用的过滤器是 It.IsAny() 而在您通过的测试中:Guid? g = new Guid();
g
不是 Guid
类型的对象,它是 Nullable<Guid>
,因此过滤器寻找 any- 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));
关于c# - Moq - 将参数从 setup() 传递到 Returns(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63468437/