2011-07-26 60 views
19

在我的方法,我有我的存儲庫這樣做:MOQ - LINQ謂詞設置方法

bool isConditionMet = MyRepository.Any(x => x.Condition == true); 

我試圖嘲弄這個使用最小起訂量,像這樣:

MyMockedRepository.Setup(x => x.Any(y => y.Condition == true)).Returns(true); 

然而,當代碼執行時,存儲庫調用始終返回false。

有沒有辦法用MOQ做到這一點?

**編輯 - 每個請求添加代碼**

我使用NHibernate的,所以我的任何方法都在我的基地倉庫,因此實現的:

public virtual bool Any(Expression<Func<T, bool>> predicate) 
{ 
    return Session.Query<T>().Cacheable().Any(predicate); 
} 
+0

你能展示更多代碼爲'MyRepository'是'Any()'Linq擴展方法還是'MyRepository'的一部分? –

+0

我從我的基礎知識庫中爲每個請求添加了我的任何方法。模擬類是'MyRepository'中實現的'IMyRepository'。 – Brandon

回答

23

則需要使用匹配調用參數It.Is,It.IsAnyIt.IsRegex

例如,返回true任何謂詞,你可以使用:

MyMockedRepository 
    .Setup(x => x.Any(It.IsAny<Expression<Func<T, bool>>>())) 
    .Returns(true); 

或者,您可以比賽所有表達式,但通過一個委託,它將返回根據表達式的值本身:

Func<Expression<Func<T, bool>, bool> resultFunc = { ... } 
MyMockedRepository 
    .Setup(x => x.Any(It.IsAny<Expression<Func<T, bool>>>())) 
    .Returns(resultFunc); 
+0

非常感謝!這工作完美。 – Brandon

+0

請問,你能告訴我resultFunc的樣子嗎? –

+0

@badrslaoui:取決於你在測試什麼/如何。例如,您可能知道您正在測試的方法將檢查存儲庫是否包含任何值並僅返回true。或者,您可以使用普通的內存中的通用'List '來嘲笑回購,這意味着您可以簡單地將表達式參數傳遞給列表的「IQueryable.Any」,並讓它返回「true」或「false」。或者,由於lambda可以捕獲外部變量,因此還可以保留一個標誌,指示是否有任何數據,然後返回標誌值。 – Groo