Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在集成测试期间不替换依赖项?_C#_Asp.net Core_Entity Framework Core - Fatal编程技术网

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
?这与主项目所引用的内容有更多关系,即使它被测试项目覆盖,测试项目将成为合成根,它需要引用所有较低的依赖项。您是否尝试让测试项目引用缺少的程序集?使用SUT
Startup
类会导致上下文最初向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"));
}