You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:15:57