gpt4 book ai didi

c# - Moq - 将参数从 setup() 传递到 Returns()

转载 作者:行者123 更新时间:2023-12-04 09:04:47 26 4
gpt4 key购买 nike

我不确定如何在 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。
为什么它无法捕获调用?有几种选择:
  • CreateCommunicationInterface 可能已重载,并且您的设置匹配了另一个您没想到的重载
  • 过滤器 (It.IsAny..) 与实际参数不匹配
  • (..)

  • 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com