2011-05-23 69 views
18

什麼可能導致It.IsAny<string>()在每次調用時返回null?假設它被設計爲返回一個非空字符串,我不正確嗎?Moq - 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."); 

回答

24

好,It.IsAny<TValue>剛剛返回調用Match<TValue>.Create的結果 - 這反過來又返回default(TValue)。對於任何引用類型,這將爲空。

不清楚你是否真的把它稱爲正確的對象 - 你不應該在模擬而不是實際的代碼上調用它嗎?

我所見過的所有樣本都在mock.Setup調用中使用It.IsAny。你能提供更多關於你如何使用它的信息嗎?

+0

啊,我明白了。我已經爲這個問題添加了完整的測試。我使用它既是爲了我的模擬,也是爲了一個真實的物體。但它聽起來像它不適用於實際的物體? – Jeremy 2011-05-23 14:47:39

+1

@Jeremy:不,這個想法是,你將真實值(以及樣本值)傳遞給你的真實代碼。 'It.IsAny'旨在驗證從您的真實代碼傳遞給您的模擬值。 – 2011-05-23 14:48:48

+0

知道了 - 所以我一直在想它作爲一種數據生成技術......但它並不是爲此而設計的。謝謝! – Jeremy 2011-05-23 14:59:16

2

It.IsAny用於匹配您的Returns()Callback()中的代碼,用於控制推送到測試中的代碼。

10

不,It.IsAny用於在您的設置中指定傳遞的ANY字符串將匹配。你可以做你的設置,以便如果你的方法只用一個特定的字符串調用,它會返回。試想一下:

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