C# 为什么在集成测试期间不替换依赖项?
我有一个数据访问项目C# 为什么在集成测试期间不替换依赖项?,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我有一个数据访问项目DataAccess,定义了实体框架核心DbContext: public class MyDbContext : DbContext { public DbSet<MyEntity> MyEntities { get; set; } } (\u configuration是传递到Startup.cs的构造函数中的i配置——与本讨论无关) 此项目引用了Microsoft.AspNetCore.App,而该项目本身引用了Microsoft.EntityFr
DataAccess
,定义了实体框架核心DbContext
:
public class MyDbContext : DbContext
{
public DbSet<MyEntity> MyEntities { get; set; }
}
(\u configuration
是传递到Startup.cs的构造函数中的i配置
——与本讨论无关)
此项目引用了Microsoft.AspNetCore.App
,而该项目本身引用了Microsoft.EntityFrameworkCore.SqlServer
然后,我有一个单独的单元测试项目ServiceTests
,其中有一个对服务的引用,还有一个对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"));
}
public void MyIntegrationTest
{
var server=newtestserver(newwebhostbuilder()
.UseEnvironment(“测试”)
.UseStartup()
.ConfigureTestServices(服务=>
{
AddDbContext(o=>o.UseInMemoryDatabase(“TestDbName”);
}));
var dbContext=server.Host.Services.GetService();
True(dbContext.myenties.Any(f=>f.Bar==“quux”);
}
问题是,此测试在server.Host.Services.GetService()
上失败,表示无法加载Microsoft.EntityFrameworkCore.SqlServer.dll
。这对我来说很奇怪,因为我的期望是内存中数据库的注册应该覆盖SQL Server数据库的注册,因此不需要加载任何特定于SQL Server的内容
即使有这样的需求,ServiceTests
引用了加载Microsoft.EntityFrameworkCore.SqlServer.dll
的Service
,因此我希望后者在需要时可以通过传递方式加载
有人能告诉我哪里出了问题吗?我尝试了许多建议,例如将test DbContext注册为singleton,但我所尝试的任何方法都无法避免此问题。测试项目是否引用了Microsoft.EntityFrameworkCore.SqlServer.dll
?这与主项目所引用的内容有更多关系,即使它被测试项目覆盖,测试项目将成为合成根,它需要引用所有较低的依赖项。您是否尝试让测试项目引用缺少的程序集?使用SUTStartup
类会导致上下文最初向SQL Server提供程序注册。然后您只需覆盖该注册以使用内存中的提供程序,但这不会覆盖依赖项。你现在基本上对两者都有依赖,即使你最终只使用一个。也就是说,SQL Server提供程序程序集应该来自项目引用,这是正确的。我能想到为什么不会发生这种情况的唯一原因是版本冲突。@Nkosi我不想在我的测试项目中引用Microsoft.EntityFrameworkCore.SqlServer
,因为在我看来,如果依赖项替换正确发生,就不需要它。
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"));
}