首页 > 解决方案 > 为什么在我的集成测试期间我的依赖项没有被替换?

问题描述

我有一个定义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引用Servicewhich 加载Microsoft.EntityFrameworkCore.SqlServer.dll,所以我希望后者会在需要时被传递加载。

谁能告诉我哪里出错了?我尝试了很多建议,例如将测试 DbContext 注册为单例,但我尝试过的任何方法都无法绕过这个问题。

标签: c#asp.net-coreentity-framework-core

解决方案


推荐阅读