Moq-тестирование LINQ Где запросы

Я использую EF 4.1 для сборки модель предметной области. У меня есть класс Task с методом Validate (string userCode), и в нем я хочу убедиться, что код пользователя сопоставляется с действительным пользователем в базе данных, поэтому:

public static bool Validate(string userCode)
{
    IDbSet<User> users = db.Set<User>();
    var results = from u in users
              where u.UserCode.Equals(userCode)
              select u;
    return results.FirstOrDefault() != null;
}

Я могу использовать Moq для имитации IDbSet без проблем. Но возникла проблема с вызовом Where:

User user = new User { UserCode = "abc" };
IList<User> list = new List<User> { user };
var users = new Mock<IDbSet<User>>();
users.Setup(x => x.Where(It.IsAny<Expression<Func<User, bool>>>())).Returns(list.AsQueryable);

Initialization method JLTi.iRIS3.Tests.TaskTest.SetUp threw exception.
System.NotSupportedException: System.NotSupportedException: Expression 
references a method that does not belong to the mocked object:
x => x.Where<User>(It.IsAny<Expression`1>()).

Кроме создания уровня косвенного обращения (например, с использованием ServiceLocator для получения объекта, который запускает LINQ, а затем имитирует этот метод), я не могу придумать, как еще это проверить , но я хочу убедиться, что нет возможности, прежде чем я добавлю еще один слой. И я вижу, что такие запросы LINQ будут нужны довольно часто, поэтому сервисные объекты могут быстро выйти из-под контроля.

Может ли какая-нибудь душа помочь? Спасибо!

15
задан Ladislav Mrnka 11 July 2011 в 08:02
поделиться