2012-08-13 43 views
3

當使用moq時,我有一個奇怪的問題。最小起訂量驗證不起作用無效

在一個項目中,當我嘗試驗證某個方法已被調用時,它說它沒有。當我調試測試時,它清楚地調用了該方法。

這是一個簡單的緩存對象,我想查看是否將某些內容添加到緩存中。我有(其中包括)添加,包含和獲取方法。

我的驗證工作正常用以下方法:

bool Contains(string key); 
T Get<T>(string key); 

但不是在這:

void Add(string key, object objectToCache, CacheItemPolicy policy); 

我已經嘗試白衣精確值,我給的方法是:

mockedCache.Verify(p => p.Add(LOCATION_CACHE_KEY, locations, policy), Times.Once()); 

使用It.IsAny

mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.IsAny<IEnumerable<string>>(), 
    It.IsAny<CacheItemPolicy>()), Times.Once()); 

無論我嘗試什麼,我都會得到被稱爲0次的響應。

我從來沒有見過這種行爲。有人可以告訴我什麼是錯的嗎?

感謝

邁克爾

更新: 作爲@SergRogovtsev建議,我看着生成的輸出最小起訂量。

不調用了IEnumerable但名單

+0

Moq傾向於寫出在斷言消息中被稱爲*的東西。叫什麼?另外,你有沒有'時代'嘗試? – 2012-08-13 14:33:50

+1

在您驗證...這是一個錯字? 'It.IsAny '。它應該是'It.IsAny ()' – 2012-08-13 14:34:45

+2

你是否認爲你的代碼是錯誤的,並且Add沒有被調用? – cadrell0 2012-08-13 14:35:26

回答

0

如你所見,起訂量不檢查通過的確切參數類型的我的方法whas,不只是他們從你斷言類型派生。如果你想要的功能,你可能需要使用這樣的事情:

mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.Is<object>(o => o is IEnumerable<string>), It.IsAny<CacheItemPolicy>()), Times.Once()); 

否則,你可能會考慮獲取起訂量的更新版本 - 我已經測試您的原始方案(在斷言使用It.IsAny<IEnumerable<string>>),它工作正常與Moq v4.0)

0

CacheItemPolicy是否實現了一個接口?如果是這樣,你會嘗試驗證呼叫與

mockedCache.Verify(p => p.Add(It.IsAny<string>(), It.IsAny<IEnumerable<string>>(), It.IsAny<ICacheItemPolicy>()), Times.Once()); 

或任何接口的名稱是?

我有同樣的問題。事情是,我的SUT方法接收到一個接口,這就是它傳遞給模擬對象的東西。雖然這個類可以實現這個接口,但接口仍然是一個不同的類型。希望這可以幫助。