C#单元测试调用DbContext.Database.ExecuteSql报错:未配置数据库提供程序
解决Moq模拟DbContext调用ExecuteSql时的数据库提供者配置错误
方法一:使用内存数据库(推荐)
没必要硬Mock DatabaseFacade,直接用EF Core的内存数据库构造真实DbContext实例,既能规避配置问题,又更贴近真实执行场景:
// 配置内存数据库选项 var options = new DbContextOptionsBuilder<YourDbContext>() .UseInMemoryDatabase(databaseName: "TestDb") .Options; // 创建真实的DbContext实例 using var context = new YourDbContext(options); // 注入实例测试目标方法 var yourService = new YourService(context); yourService.MethodThatCallsExecuteSql();
方法二:正确Mock DatabaseFacade与ExecuteSql
若坚持用Moq模拟,需绕过DatabaseFacade内部检查,直接Mock目标方法(注意:EF Core 3.x+版本方法名为ExecuteSqlRaw,旧版为ExecuteSql):
var mockContext = new Mock<YourDbContext>(); // 模拟DatabaseFacade并设置ProviderName,避免内部配置检查 var mockDatabase = new Mock<DatabaseFacade>(mockContext.Object); mockDatabase.Setup(d => d.ProviderName).Returns("Microsoft.EntityFrameworkCore.InMemory"); // 模拟ExecuteSqlRaw方法,返回受影响行数可按需调整 mockContext.Setup(c => c.Database.ExecuteSqlRaw(It.IsAny<string>(), It.IsAny<object[]>())) .Returns(1); mockContext.Setup(c => c.Database).Returns(mockDatabase.Object); // 注入Mock实例测试 var yourService = new YourService(mockContext.Object); yourService.MethodThatCallsExecuteSql();
注意事项
- 若使用异步方法
ExecuteSqlRawAsync,需Mock返回Task<int>类型结果 - 内存数据库方式更可靠,Mock
DatabaseFacade易遗漏内部依赖属性,引发其他潜在问题
内容的提问来源于stack exchange,提问作者Keer
相关产品推荐
相关产品推荐

