Moq - It.IsAny<string>() 总是返回 null

25

It.IsAny<string>()每次调用返回null的可能原因是什么?我是否错误地认为它应该返回一个非空字符串?

这里是使用方法 - 在这个方法中,如果第二个参数(连接字符串)为null,则Login方法会抛出ArgumentNullException异常。 我曾经假设It.IsAny<string>()会提供一个非空字符串,从而可以避免ArgumentNullException异常。

var mockApiHelper = new Mock<ApiHelper>();
mockApiHelper.Setup(m => m.Connect(It.IsAny<string>(), 
                                   It.IsAny<string>(), 
                                   It.IsAny<string>()));

var repositoryPlugin = new RepositoryPlugin(mockApiHelper.Object);
repositoryPlugin.Login(new CredentialsInfo(), It.IsAny<string>());

Assert.IsTrue(repositoryPlugin.LoggedIn, 
    "LoggedIn property should be true after the user logs in.");
3个回答

30

嗯,It.IsAny<TValue> 只是返回调用 Match<TValue>.Create 的结果 - 其中再次返回default(TValue)。对于任何引用类型都将为 null。

不过还不清楚您是否真的在正确的对象上调用它 - 您应该在模拟(mock)而不是真正的代码上调用它吧?

我看到的所有示例都在 mock.Setup 的上下文中使用了 It.IsAny。您能否提供有关如何尝试使用它的更多信息?


啊,我明白了。我已经将完整的测试添加到问题中。我既用它来进行模拟,也用它来处理真实对象。但是听起来它似乎不适用于实际对象的使用? - Jeremy
3
不,这个想法是你将真实的值(或者样本值)传递给你的真实代码。It.IsAny 的作用是验证从你的真实代码传递给模拟对象的值。 - Jon Skeet
明白了 - 所以我一直认为它是一种数据生成技术...但它并不是为此而设计的。谢谢! - Jeremy
如果你想让某些东西作为数据生成工具,可以看看 Pex。在我看来,它们很好地协同工作。 - John Nicholas

11

不是的,It.IsAny 用于在您的 Setup 中指定任何传递的字符串都将匹配。您可以进行设置,以使如果仅使用特定字符串调用方法,则会返回。考虑以下代码:

myMock.Setup(x => x.DoSomething(It.IsAny<string>()).Return(123);
myMock.Setup(x => x.DoSomething("SpecialString").Return(456);
无论使用模拟对象的是什么,它们将根据在调用DoSomething时传递给模拟对象的参数而获得不同的值。 当验证方法调用时,您也可以做同样的事情。
myMock.Verify(x => x.DoSomething(It.IsAny<string>())); // As long as DoSomething was called, this will be fine.
myMock.Verify(x => x.DoSomething("SpecialString"));  // DoSomething MUST have been called with "SpecialString"

另外,我看到您编辑了您的问题。不再是:

Assert.IsTrue(repositoryPlugin.LoggedIn, 
    "LoggedIn property should be true after the user logs in.");

做这个:

mockApiHelper.Verify( x => 
   x.Connect(It.IsAny<string>(), It.IsAny<string>(), 
       It.IsAny<string>()), Times.Once()); 

将 times 更改为您期望的任何值。如果您期望特定的值,请用实际值替换相关的 It.IsAny<string>() 调用。


3

It.IsAny 用于匹配 Returns()Callback() 中的代码,控制将什么内容推入测试中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接