我的一个API路由使用原始sql merge into
命令来执行原子upsert操作,并且在我的自动化测试中,我有一个TestServer
实例使用in-内存db提供程序。它给了我一个错误,可能是因为内存提供程序不支持运行原始sql命令 - 这是真的吗?如果没有,我该如何让它工作?
这里是测试的Startup
类:
// In memory DB for testing
services.AddDbContext<MyContext>(optionsBuilder => optionsBuilder.UseInMemoryDatabase("stuff"));
services.AddDbContext<MyStatusContext>(optionsBuilder => optionsBuilder.UseInMemoryDatabase("status"));
services.AddDbContext<MyUserRolesContext>(optionsBuilder => optionsBuilder.UseInMemoryDatabase("userroles"));
API代码正如您所期望的那样:
var count = await context.Database.ExecuteSqlCommandAsync(@"merge into ...", default(CancellationToken), ...);
return count;
这段代码在真实数据库的生产中运行良好,我只是不能在我的测试中使用内存提供程序。我有什么希望吗?什么是自定义sql脚本的常用测试策略?
答案 0 :(得分:5)
你没有希望,因为InMemory提供者是NoSQL非关系提供者。您应该使用SQL Server(例如localdb)进行集成测试
答案 1 :(得分:1)
您已经发现内存提供程序无法执行关系操作(合理的限制)。
我遇到了类似的问题,最终建立了一个库来扩展内存提供程序以支持关系操作-EntityFrameworkCore.Testing。它将执行ExecuteSqlCommand / ExecuteSqlCommandAsync模拟。
答案 2 :(得分:0)
相反,您可以使用Inlite DB来使用SQL lite,该SQL Lite与sql兼容,并且像在内存数据库中一样非常容易设置。
https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/sqlite