每次通话时可能导致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.");
答案 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()
中的代码,以控制推送到测试中的内容。