模拟数据库.GetDbConnection



请帮助我了解如何模拟someDbContext.Database.GetDbConnection()

目前,我有存储库模式和唯一具体的数据库上下文,它们在那里注入。在单元测试中,我想测试AddSomeEntity和RemoveSomeEntity方法的行为,确切地说,我使用someDbContext.Database.GetDbConnection()来获得dbConnection,然后创建dbCommand并执行它。

我知道如何解决这个问题的几种方法:在存储库类中添加抽象或一些逻辑,但它似乎过于复杂。所以我想问一些想法,我如何在单元测试类中直接模拟这个方法调用,而不在源类中添加任何类或方法。

我尝试过使用EF Core 6、xUnit、Moq和FluentAssessments,但没有合适的解决方案。

我当前如何模拟db上下文

contextMock.Setup(x => x.SomeDbSet)
.ReturnsDbSet(new List<SomeEntity>
{
new()
{
// initialization of class fields 
}
});

如果您使用的是Repository模式,那么这是单元测试/模拟的完美边界。单元测试测试业务逻辑,这样存储库就可以模拟为提供已知的数据状态和/或断言进行了正确的调用来持久化数据状态。

在我的情况下,我的存储库利用IQueryable,所以我使用MockQueryable。Moq现在用于将已知集合包装为IQueryable,以便同时使用同步和异步消耗。

为了测试存储库实现本身,我建议在集成测试级别使用实时数据源进行处理。这可以是具有预先已知的初始数据状态的数据库,也可以是内存中的数据库。内存中数据库的行为可能与实际数据库不同,因此我倾向于使用备份数据库映像进行集成测试。

最新更新