2012-11-16 72 views
5

我想創建一個通用的測試類來測試我的通用控制器。一切工作正常,除了這一點: 我有這樣的方法:表達式<Func <T, bool>>與It.IsAny總是返回true

private T GetSingle(Expression<Func<T, bool>> expression) 

我試圖安裝測試,如下所示:

var Guids = new[] { Guid.NewGuid(), Guid.NewGuid() }; 
var items = Guids.Select(x => new T {Id = x}); 
var mock = new Mock<IRepository<T>>(); 
mock.Setup(m => m.GetSingle(
    It.IsAny<Expression<Func<T, bool>>>())) 
    .Returns(new T()); 

並執行這樣的測試:

var value = Repository.GetSingle(x=> x.Id == Guid.NewGuid()); 

總是返回一個新的T.

我的設置錯了嗎?

+0

什麼是你正在測試?在我看來,你想嘲笑實際執行存儲庫查找邏輯。 – fsimonazzi

回答

8

您指示Moq返回相同的確切實例(本例中爲new T()),無論提供何種表達式,都會調用任何時間GetSingle。你真正想要的是它針對items調用表達式:

mock.Setup(m => m.GetSingle(It.IsAny<Expression<Func<T, bool>>>())) 
    .Returns<Expression<Func<T, bool>>>(expression => items.AsQueryable().Single(expression)); 
+0

謝謝黑客!我一直在研究這一段時間,並且無法讓它正常工作。我很新,感謝幫助我改進! –

+1

'Single()'確實做了什麼,它具有[重載](http://msdn.microsoft.com/zh-cn/library/bb534800.aspx),它完全採用該參數。而且可能會更好,因爲如果有多個匹配項目,它會拋出。 – svick

+0

是的,我對謂詞過載的錯誤。 – HackedByChinese

相關問題