最小起订量-将参数从setup传递给return

问题描述

我不确定如何在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在评论中指出了GuidGuid?的区别。实际上,通过测试时,您使用的过滤器是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));

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...