gpt4 book ai didi

unit-testing - FakeItEasy DbSet/IQueryable - Entity Framework 6

转载 作者:行者123 更新时间:2023-12-04 04:12:14 25 4
gpt4 key购买 nike

我想知道是否有人有类似的例子 post对于 FakeItEasy(原帖是 here 。我一直在尝试找到正确的设置,但找不到正确的设置。我在网上找不到任何示例。我开始自学单元测试,我决定使用 FakeItEasy。到目前为止,我所有的项目都使用 Entity Framework 并且不使用 Repository/UOW 模式,因为我认为 DbSet 和 DbContext 对我的小规模应用程序来说已经足够好了。我知道 EF 和单元测试各有利弊,但我仍然想要弄清楚这一点。我很确定我的尝试(见下文)离我很远,因为我得到的错误是

System.NotImplementedException: The member 'IQueryable.Provider' has not been implemented on type 'DbSet1Proxy' which inherits from
'DbSet
1'. Test doubles for 'DbSet`1' must provide implementations of methods and properties that are used.

任何方向都会很有帮助。谢谢。

var data = new List<Request> 
{
request1,
request2,
request3
}.AsQueryable();

var fakeDbSet = A.Fake<DbSet<Request>>();

A.CallTo(() => ((IQueryable<Request>)fakeDbSet).Provider).Returns(data.Provider);
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).Expression).Returns(data.Expression);
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).ElementType).Returns(data.ElementType);
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).GetEnumerator()).Returns(data.GetEnumerator());

var fakeContext = A.Fake<RequestPortalContext>();
A.CallTo(() => fakeContext.Requests).Returns(fakeDbSet);

var service = new RequestReadService(fakeContext);
var requests = service.GetAllRequests();

Assert.AreEqual(3, requests.Count);
Assert.AreEqual("Test1", requests[0].Name);
Assert.AreEqual("Test2", requests[1].Name);
Assert.AreEqual("Test3", requests[2].Name);

最佳答案

我根本不熟悉 EntityFramework,也不能确定发生了什么,因为没有 NotImplementedException 的堆栈跟踪,但这是我的猜测:

您看到从定义 service 的行引发的异常或调用 GetAllRequests 的那个, 而不是 A.Fake<DbSet<Request>>()行。

这听起来像是 RequestReadService 的内部结构(那是你的课,我在别处找不到吗?)或者它调用的东西依赖于 DbSet 也实现了 IQueryable.Provider .现在。我不确定为什么它还没有出现。也许是显式实现导致它失败。我能建议的最好的(我还没有尝试过,因为我完全缺乏 EF6 知识)可能是尝试显式地将接口(interface)添加到假的:

A.Fake<DbSet<Request>>(builder => 
builder.Implements(typeof (IQueryable<Result>)));

虽然在我输入之后,我读到了 FakeItEasy issue 31 ,我担心这可能适用,所以我的想法可能行不通。再一次,如果你愿意,试一试。可能不会花很长时间。

或者,在短期内,我不确定还有什么其他解决方法可以建议。也许伪造一些 DbSet 的接口(interface)实现而不是伪造 DbSet本身?

已更新:在另一个关于此类问题的问题之后,实际上捕获了 EF6 以便我可以尝试一下,我创建了 Issue 477跟踪此处似乎存在的潜在问题。

关于unit-testing - FakeItEasy DbSet/IQueryable<T> - Entity Framework 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22454174/

25 4 0