什么可能导致It.IsAny<string>()
在每次调用时都返回 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.");
好吧,It.IsAny<TValue>
只返回调用Match<TValue>.Create
的结果 - 这反过来又返回default(TValue)
.对于任何引用类型,这将为 null。
不过,目前还不清楚你是否真的在正确的对象上调用它 - 你不应该在模拟而不是在真正的代码上调用它吗?
我看到的所有示例都It.IsAny
在mock.Setup
调用的上下文中使用。您能否提供有关您尝试如何使用它的更多信息?
不,It.IsAny
用于在设置中指定传递的任何字符串都将匹配。 您可以进行设置,以便如果仅使用特定字符串调用方法,它将返回。 考虑一下:
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());
将时间更改为您期望的任何时间。如果需要特定值,请将相关It.IsAny<string>()
调用替换为这些实际值。
It.IsAny
用于匹配Returns()
和Callback()
中的代码,用于控制推送到测试中的内容。