我的API路由之一使用RAW SQL merge into
命令来执行Atomic UpSert操作,在我的自动化测试中,我有一个TestServer
实例,该实例使用内存内存DB提供者。它给了我一个错误,可能是因为内存提供者不支持运行RAW 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脚本的通常测试策略是什么?
没有希望的希望,因为犯罪服务提供商是NOSQL非关系提供商。您应该使用SQL Server(例如LocalDB)进行集成测试
您发现了内存提供者无法进行关系操作(合理的限制)。
我也有类似的问题,最终将图书馆放在一起,以扩展内存提供商以支持关系操作-EntityFrameWorkCore.testing。它将执行executesqlCommand/executesqlCommandAsync模拟。