gpt4 book ai didi

c# - 使用 Moq .GetMock 向 Linq 表达式注册 ~1IRepository?

转载 作者:行者123 更新时间:2023-11-30 22:47:40 24 4
gpt4 key购买 nike

是否可以使用 ~1Repository 等通用类通过 Moq 模拟 Linq 表达式。 ~IRepository 是通过 StructureMap 或 Windsor 等 IoC 注入(inject)的东西吗?

要测试的代码:

   var person = _repository.Find<Person>()
.Where(p => p.Id == person.Id).SingleOrDefault();

测试:

    var repository = new Mock<IRepository>();

repository.Setup(i => i.Find<Person>()
.Where(p => p.Id == person.Id).SingleOrDefault())
.Returns(person).Verifiable();

异常(exception)情况:

System.ArgumentException: Invalid setup on a non-member method:i => i.Find().Where(p => p.Id == "Fred").SingleOrDefault()

解决方案

    using System.Linq;
...

_container.GetMock<IRepository>.Setup(i => i.Find<Person>())
.Returns(new List{person}.AsQueryable()).Verifiable();

...

最佳答案

如果Find<T>()IRepository 上的扩展方法, 那么我认为它不会起作用,因为你正在处理一个 static类型。

如果Find<T>()IRepository 上的一个方法, 那么你只为 repository.Find<Person>() 设置一个返回值.

创建一个 IEnumerable<>IQueryable<>对于 Find<>()返回(无论它实际应该返回哪种类型——我不知道它是哪种类型),LINQ 表达式只会在实际类中对其进行处理。您不必模拟 LINQ,因为这只是过滤您自己方法的结果,即使在生产中,如果这是 Entity Framework 或 LINQ to SQL,整个表达式将被转换为优化的数据库打电话。

如果在您的设置中您为集合提供了一个具有匹配 ID 的项目,您将断言您已取回它。
如果在您的设置中您没有为集合提供具有匹配 ID 的项目,您将断言您得到了 null (默认)。
如果在您的设置中您返回 null来自 repository.Find<>() , 你会断言抛出异常是因为你不能在 null 上调用扩展方法.

关于c# - 使用 Moq .GetMock 向 Linq 表达式注册 ~1IRepository?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2151751/

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