[英]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 调用。 它变得丑陋,但一种方法是:
using (var ctx = _data.Create())
void SetChangeTracking(bool enabled);
然后你可以调用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.