c# - 为什么在我的集成测试期间我的依赖项没有被替换?
问题描述
我有一个定义DataAccess
了实体框架核心的数据访问项目DbContext
:
public class MyDbContext : DbContext
{
public DbSet<MyEntity> MyEntities { get; set; }
}
我的 Web API 项目Services
在其中引用DataAccess
了以下内容Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<DataAccess.MyDbContext>(o => o.UseSqlServer(_configuration.GetConnectionString("MyConnectionStringName")));
}
(_configuration
是一个IConfiguration
传递给构造函数的Startup.cs
- 与本讨论无关)。
这个项目有一个引用,Microsoft.AspNetCore.App
它本身也引用了Microsoft.EntityFrameworkCore.SqlServer
.
然后,我有一个单独的单元测试项目ServiceTests
,其中包含对 的引用Services
以及对的引用,Microsoft.EntityFrameworkCore.InMemory
以便我可以将 SQL Server 提供程序换出内存中的提供程序。
定义了以下集成测试:
public void MyIntegrationTest
{
var server = new TestServer(new WebHostBuilder()
.UseEnvironment("Testing")
.UseStartup<Services.Startup>()
.ConfigureTestServices(services =>
{
services.AddDbContext<DataAccess.MyDbContext>(o => o.UseInMemoryDatabase("TestDbName"));
}));
var dbContext = server.Host.Services.GetService<DataAccess.MyDbContext>();
Assert.True(dbContext.MyEntities.Any(f => f.Bar == "quux"));
}
问题是这个测试失败了server.Host.Services.GetService<DataAccess.MyDbContext>()
,说它无法加载Microsoft.EntityFrameworkCore.SqlServer.dll
。这对我来说很奇怪,因为我的期望是内存数据库的注册应该覆盖 SQL Server 数据库的注册,因此不需要加载任何特定于 SQL Server 的内容。
即使有这样的需要,ServiceTests
引用Service
which 加载Microsoft.EntityFrameworkCore.SqlServer.dll
,所以我希望后者会在需要时被传递加载。
谁能告诉我哪里出错了?我尝试了很多建议,例如将测试 DbContext 注册为单例,但我尝试过的任何方法都无法绕过这个问题。
解决方案
推荐阅读
- typescript - 有没有办法在 Typescript 中使用泛型强制类型动态相同?
- java - 等待一个锁解锁,解锁后不加锁
- ios - 当我使用 Swift 4.2 和 iOS12 向左滑动时,如何将第二个数组加载到 UITableView 中?
- spring-boot - Java 11 + QueryDSL 4 + Gradle 5 + SpringBoot 2.1-不生成 QClasses
- reactjs - 使用 DateRangePicker 在特定月份阻止一周中的某一天
- r - 正则表达式 Tidyverse,如果存在,如何捕获表达式
- python - 为什么在 Python 3 中 NotImplemented 是真实的?
- java - 在 where 条件 - 条件中连接 2 列
- url - 如何在 Kotlin/Native 中使用 URL
- sql - SQL - 根据客户支出计算百分位数