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

标签 c# moq xunit

我不确定如何在 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/

    相关文章:

    java - 在 JAX-RS 中使用位置 header 创建响应

    c# - directory.exists 是否适用于 URL?

    unit-testing - 单元测试递归函数

    c# - 如何使用内部构造函数模拟事件

    c# - xUnit 中的基本断言

    c# - 将 "M/d/yyyy h:mm:ss tt"转换为 "YYYY-MM-DDThh:mm:ss.SSSZ"

    c# - 在 BackgroundWorker 和主线程之间共享对象

    asp.net-mvc - 尝试使用 Moq 模拟 HtmlHelper 时抛出 MissingMethodException

    c# - 针对 EF Core 和 SQL Server 数据库编写集成测试

    visual-studio - pdb 尝试调试单元测试时出现 UnauthorizedAccessException