【问题标题】:Inspect Moq Call parameters so far到目前为止检查 Moq Call 参数
【发布时间】:2018-08-07 21:06:47
【问题描述】:

我的界面包含

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

我已经设置了起订量

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 还不支持此功能?

我会假设我可以在检查器中找到它,但经过一番查看后我没有看到它。

【问题讨论】:

    标签: c# unit-testing moq optional-parameters


    【解决方案1】:

    虽然问题和情况不同

    我在这里找到了答案:

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

    ...测试失败,因为 It.IsAny 方法已在匹配器工厂之外进行了评估。因此,您的 MemberAccess 表达式为 0。

    Moq 将正确实现默认的可选参数,真正的问题是 It.Is 必须在 setup 函数中使用。

    所以不是

    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");
    

    进一步,检查一个 Mock 到目前为止已发送的参数。你应该可以在这里查看:

    moqedInterface.Invocations
    

    但是我的 Moq 特定版本在检查器中没有对我可见的此字段。

    【讨论】:

      猜你喜欢
      • 2016-05-08
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-12-13
      • 2020-10-09
      • 2013-04-09
      • 1970-01-01
      相关资源
      最近更新 更多