到目前为止检查Moq Call参数

时间:2018-08-07 21:06:48

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

我有一个包含

的界面
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是否不支持此功能?

我认为我可以在检查器中找到它,但是经过一番看后我看不到它。

1 个答案:

答案 0 :(得分:0)

问题和情况不同

我在这里找到了答案:

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

  

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

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

所以不是

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版本在检查器中对我不可见此字段。