代码之家  ›  专栏  ›  技术社区  ›  Jody Sowald

到目前为止检查moq调用参数

  •  0
  • Jody Sowald  · 技术社区  · 7 年前

    我有一个界面,包括

    string Foobar(string one, string two, string three = null, string four = null);
    

    我已经设置了MOQ

    var inputType1 = It.is<string>(x=>x=="1111");
    var moqedInterface = new Mock<SomeInterface>();
    moqedInterface
        .setup(x=>x.Foobar(inputType1,null,null,null)
        .returns("hiya");
    

    然后我打电话

    string result = moqedInterface.Foobar("1111", null); //no optional parameters used
    

    在实践中,通常在没有可选参数的情况下调用此接口,测试应该考虑并反映这种用法。无论是准确性还是可读性。

    但当我试图验证或检查结果时

    Assert.NotNull(result); //fails
    moqedInterface
       .Verify(x=>x.Foobar(It.is<string>(x=>x=="1111"), null, null, null),Times.Once); //fails
    

    虽然我怀疑mock<>可能将可选参数默认为非空值,如空字符串。我无法证实。 虽然我可以在试验的基础上测试这个特定的理论和任何其他理论,但我没有办法简单地检查发送的内容。

    由于moq将输入参数存储在某个地方,以便稍后进行验证,所以我应该能够在对象中的某个地方检查到目前为止发送的内容,对吗?在moq对象中,我可以在哪里查找到调试时调用的参数?

    此外,moq在可选参数上的默认行为是什么?参数是否仍默认为预期值,或者moq还不支持此功能?

    我想我可以在检查员那里找到它,但看了一眼就看不见了。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Jody Sowald    7 年前

    但问题和情况不同

    我在这里找到了答案:

    Why does Moq setup/verify matcher fail when It.Is…() is called from anonymous function

    …测试失败,因为it.isany方法已在匹配器工厂外部评估。因此,您将memberAccess表达式设置为0。

    moq将正确实现默认的可选参数,真正的问题是它必须在设置函数中使用。

    所以不是

    var inputType1 = It.is<string>(x=>x=="1111"); 
    //bad. evaluated outside of the MatcherFactory
    moqedInterface
        .setup(x=>x.Foobar(inputType1,null,null,null)
        .returns("hiya");
    

    这样就行了

    moqedInterface
        .setup(x=>x.Foobar(It.is<string>(x=>x=="1111"),null,null,null)
        .returns("hiya");
    

    此外,检查到目前为止已发送的参数的模拟。您应该可以在这里查看:

    moqedInterface.Invocations
    

    然而,我的moq的特定版本在检查员中没有这个字段对我可见。