繁体   English   中英

如何模拟实体框架核心更改跟踪

[英]How to Mock Entity Framework Core Change Tracking

我有一个这样的模拟上下文设置。

// Creates a working Fake Db Set of FakeClass Type
var fakeDbSet = Mockings.CreateDbSetMock(fakeData);  
var fakeContext = new Mock<FakeContext>();  
fakeContext.Setup(c => c.FakeData).Returns(fakeDbSet);     

访问上下文本身和 FakeData 按预期工作。 但是现在我正在尝试为访问 fakeContext 的 ChangeTracker 的函数编写单元测试。

ctx.ChangeTracker.AutoDetectChangesEnabled = false;  

现在测试失败并抛出异常,因为访问模拟上下文的 ChangeTracker 返回 null。

有没有办法模拟上下文的 ChangeTracker?

我已经尝试使用模拟的 ChangeTracker 设置模拟的上下文,但是我无法创建有效的实例,因为它需要构造函数中的上下文本身。

您需要包装 ChangeTracker 调用。 它变得丑陋,但一种方法是:

  1. 修改您的生产代码以通过工厂设置上下文,以便您可以使用接口来处理上下文。
     using (var ctx = _data.Create())
  2. 扩展界面以包含跟踪器的切换。
     void SetChangeTracking(bool enabled);
  3. 扩展您的 FakeContext 以实现新的包装器接口。

然后你可以调用SetChangeTracking(true); 在您的生产代码中。 SetChangeTracking 实现应该修改 ctx 对象,而测试代码可以安全地返回 void。

在某些情况下,模拟 EF DbContext 可能非常棘手,但是在大多数情况下,您不需要(也不应该)模拟 DbContext。 您可以使用InMemoryDatabase选项而不是模拟 DbContext。(如果您需要诸如DbQuery或任何与 RDBMS 相关的功能,这对您没有帮助)

 var options = new DbContextOptionsBuilder<MyContext>().UseInMemoryDatabase(databaseName: "MyInMemoryDB").Options;
 var ctx = new MyContext(options);

阅读有关在内存中测试的更多信息

但是,如果您坚持使用模拟的 DbContext,请查看此线程: https ://forums.asp.net/t/2155192.aspx?Mocking+EF+Core+DBContext+with+ChangeTracker

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM