我有一个包含的接口
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<>可以将可选参数默认为非null值,如空字符串。我对此无法证实。虽然我可以在试验的基础上测试这个特定的理论和任何其他理论,但我没有办法简单地检查发送的内容。
由于Moq将输入参数存储在某个地方以供稍后验证,我应该能够查看对象中的某个地方来检查到目前为止发送的内容,对吗?在Moq对象中,我可以在哪里查找调试时迄今为止调用过的参数?
此外,Moq在可选参数上的默认行为是什么?参数是否仍然默认为其预期值,或者Moq是否还不支持此功能?
我想我可以在检查员那里找到它,但经过一番查找,我没有看到。
虽然问题和情况不同
我在这里找到了答案:
从匿名函数调用It.Is…((时,为什么Moq设置/验证匹配器失败
。。。测试失败,因为It.IsAny方法已在匹配器工厂外进行了评估。因此,您有一个0的MemberAccess表达式。
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在检查员中没有这个字段。