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



什么可能导致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.IsAnymock.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()中的代码,用于控制推送到测试中的内容。

相关内容

  • 没有找到相关文章

最新更新