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

时间:2011-05-23 14:29:54

标签: moq

每次通话时可能导致It.IsAny<string>()返回null的原因是什么?假设它被设计为返回非空字符串,我是不正确的?

这是用法 - Login方法为null第二个参数(连接字符串)抛出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 个答案:

答案 0 :(得分:25)

好吧,It.IsAny<TValue>只返回调用Match<TValue>.Create的结果 - 后者又返回default(TValue)。对于任何引用类型,它都将为null。

目前尚不清楚你是否真的在正确的对象上调用它 - 你不应该在模拟而不是实际代码上调用它吗?

我见过的所有示例都在It.IsAny调用的上下文中使用mock.Setup。你能提供一些关于你如何使用它的更多信息吗?

答案 1 :(得分:10)

不,It.IsAny用于在您的安装程序中指定传递的任何字符串将匹配。您可以进行设置,以便只有使用特定字符串调用方法时才会返回。考虑一下:

myMock.Setup(x => x.DoSomething(It.IsAny<string>()).Return(123);
myMock.Setup(x => x.DoSomething("SpecialString").Return(456);

无论使用mock的是什么,都将获得不同的值,具体取决于调用DoSomething时传递mock的参数。验证方法调用时,您可以执行相同的操作:

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()); // Change times to whatever you expect.  If you expect particular values, replace the relevent It.IsAny<string() calls with those actual vaules.

答案 2 :(得分:2)

It.IsAny用于匹配Returns()Callback()中的代码,以控制推送到测试中的内容。