存储库中的Moq - Linq表达式 - 在设置中指定表达式

时间:2013-04-20 19:25:17

标签: c# linq mocking moq

我的界面上有一个方法如下:

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

我正在尝试模拟这样的设置(我意识到这不起作用):

_mockUserRepository = new Mock<IRepository<User>>();
_mockUserRepository.Setup(c => c.GetSingle(x => x.EmailAddress == "a@b.com"))
    .Returns(new User{EmailAddress = "a@b.com"});

我意识到我将错误的参数传递给设置 阅读this answer之后,我可以通过传递Expression来实现它,就像这样:

_mockUserRepository.Setup(c => c.GetSingle(It.IsAny<Expression<Func<User, bool>>>())
    .Returns(new User{EmailAddress = "a@b.com"});

但是,这意味着如果我使用任何表达式调用GetSingle方法,则会返回相同的结果。

有没有办法在设置中指定要使用的表达式?

2 个答案:

答案 0 :(得分:8)

我设法让这个工作:

Expression<Func<User, bool>> expr = user => user.EmailAddress == "a@b.com";

_mockUserRepository.Setup(c => c.GetSingle(It.Is<Expression<Func<User, bool>>>(criteria => criteria == expr)))
    .Returns(new User { EmailAddress = "a@b.com" });

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

答案 1 :(得分:3)

如果您不介意通用设置,可以更简单。

_mockUserRepository.Setup(c => c.GetSingle(It.IsAny<Expression<Func<User, bool>>>()))
    .Returns(new User { EmailAddress = "a@b.com" });