2013-04-20 16 views
9

表達我有我的接口上的一個方法,看起來像:起訂量 - 在倉庫LINQ表達式 - 指定安裝

T GetSingle(Expression<Func<T, bool>> criteria); 

我試圖嘲弄的設置是這樣的(我知道這是不是工作):

_mockUserRepository = new Mock<IRepository<User>>(); 
_mockUserRepository.Setup(c => c.GetSingle(x => x.EmailAddress == "[email protected]")) 
    .Returns(new User{EmailAddress = "[email protected]"}); 

我意識到我傳遞了錯誤的參數設置。
閱讀this answer後,我可以得到它通過傳遞表達式,像這樣的工作:

_mockUserRepository.Setup(c => c.GetSingle(It.IsAny<Expression<Func<User, bool>>>()) 
    .Returns(new User{EmailAddress = "[email protected]"}); 

但是,這意味着如果我稱之爲GetSingle方法與任何表達式,則返回相同的結果。

有沒有在設置中指定要使用哪個表達式的方法?

回答

3

如果你不介意的一組通用了,它可以是這樣簡單。

_mockUserRepository.Setup(c => c.GetSingle(It.IsAny<Expression<Func<User, bool>>>())) 
    .Returns(new User { EmailAddress = "[email protected]" }); 
+3

我不明白這是如何回答這個問題的。提問者明確表示,他希望避免使用通用表達。 – 2014-05-22 17:10:16

+0

我的記憶有點模糊,但最初的問題是嘲笑接受表達的方法。我想Alex更新了這個問題,因爲他想根據給定的表達式返回不同的結果。 – Andy 2014-05-23 14:14:43

+0

一個可能的故事;) – 2014-05-24 00:24:11

7

我設法得到這個工作:

Expression<Func<User, bool>> expr = user => user.EmailAddress == "[email protected]"; 

_mockUserRepository.Setup(c => c.GetSingle(It.Is<Expression<Func<User, bool>>>(criteria => criteria == expr))) 
    .Returns(new User { EmailAddress = "[email protected]" }); 

User result = _mockUserRepository.Object.GetSingle(expr);