gpt4 book ai didi

linq - Moq 测试 LINQ Where 查询

转载 作者:行者123 更新时间:2023-12-03 15:10:49 25 4
gpt4 key购买 nike

我正在使用 EF 4.1 来构建域模型。我有一个带有 Validate(string userCode) 方法的 Task 类,在其中我想确保用户代码映射到数据库中的有效用户,因此:

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 查询将经常需要,因此服务对象可能会迅速失控。

有好心人能帮忙吗?谢谢!

最佳答案

There is an article on MSDN highlighting how to mock using moq :
它的要点是用 linq to objects 表示 linq to entity 操作。

var mockSet = new Mock<DbSet<Blog>>(); 
mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

正如 Ladislav 指出的那样,这有其缺点,因为 Linq To Objects 与 Linq to Entities 完全不同,因此可能会导致误报。但它现在是一篇 MSDN 文章,它确实指出它至少是可能的,并且在某些情况下可能会被推荐?

自从这篇文章的原始答案以来,可能发生的一件事是 Entity Framework 团队在 EF 6.0 中开放了 Entity Framework 的区域,以便更容易模拟它的内部。

关于linq - Moq 测试 LINQ Where 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6645645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com