Moq - It.IsAny <string>()始终返回null

Jer*_*emy 19 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.");
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 25

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

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

我见过的所有样本都It.IsAnymock.Setup通话环境中使用.你能提供一些关于你如何使用它的更多信息吗?

  • @Jeremy:不,这个想法是你将真实值(好的,样本值)传递给你的真实代码.`It.IsAny`意味着验证从你的真实代码传递到你的模拟的值. (3认同)

And*_*ndy 10

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

myMock.Setup(x => x.DoSomething(It.IsAny<string>()).Return(123);
myMock.Setup(x => x.DoSomething("SpecialString").Return(456);
Run Code Online (Sandbox Code Playgroud)

无论使用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"
Run Code Online (Sandbox Code Playgroud)

另外,我看到你编辑了你的问题.代替:

Assert.IsTrue(repositoryPlugin.LoggedIn, "LoggedIn property should be true after the user logs in.");
Run Code Online (Sandbox Code Playgroud)

做这个:

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.
Run Code Online (Sandbox Code Playgroud)