Я использую 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 понадобятся довольно часто, поэтому объекты службы могут быстро выйти из-под контроля.
Помогла ли какая-нибудь душа? Спасибо!