带有InMemoryDatabase的TestStartup的Bootstrapping TestServer失败(.Net core)

时间:2016-04-21 14:02:05

标签: asp.net-core integration-testing asp.net-core-mvc .net-core

也许我错过了一些东西,或者某些事情可能已经破裂了。我希望能找到这里发生的事情。

TLDR:使用InMemory数据库引导TestServer类,得到 (No service for type 'Microsoft.Data.Entity.Storage.IRelationalConnection' has been registered)。有线索吗?更多详情如下:

我有一个测试类,它使用TestFixture来引导:

public AccountControllerTest(TestServerFixture testServerFixture) : base(testServerFixture)
    {
    }

testServerFixture看起来像这样: 公共类TestServerFixture:IDisposable     {         public TestServer server {get; }

    public HttpClient client { get; }

    public TestServerFixture()
    {
        // Arrange
        var builder = TestServer.CreateBuilder()
            .UseEnvironment("Development")
            .UseStartup<TestPortalStartup>()
            .UseServices(services =>
            {
                // Change the application environment to the mvc project
                var env = new TestApplicationEnvironment();
                env.ApplicationBasePath =
                    Path.GetFullPath(Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "..", "MY_APP"));
                env.ApplicationName = "MY_APP";
                //SUPER IMPORTANT: Should be the real application name, else you'll get Roslyn Compiler Errors in your views

                services.AddInstance<IApplicationEnvironment>(env);
            });

        server = new TestServer(builder);

        client = server.CreateClient();
    }

    public void Dispose()
    {
        server.Dispose();
        client.Dispose();
    }
}

正如您所看到的,它使用TestPortalStartup,如下所示: 公共类TestPortalStartup:启动     {         private Mock accountRegistrationClientMock;

    public TestPortalStartup(IHostingEnvironment env, IApplicationEnvironment appEnv) : base(env, appEnv)
    {
    }

    public override void SetUpDataBaseAndMigrations(IServiceCollection services)
    {
        services
          .AddEntityFramework()
          .AddInMemoryDatabase()
          .AddDbContext<CmsDbContext> (
            options => options.UseInMemoryDatabase()
        );
    }


    public override void AddFrameworkDependencies(IServiceCollection services)
    {
    // ... not relevant
    }

}

正如您在SetUpDataBaseAndMigrations中看到的那样,我们引导了InMemoryDatabaseDbContext

之前我使用过这个构造来测试处理数据库的服务。 (但这是孤立的)。

现在进行集成测试后,我最终无法通过以下方式引导测试:

  

结果StackTrace:at   Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService(的IServiceProvider   provider,输入serviceType)at   Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService [T](的IServiceProvider   提供者)   Microsoft.Data.Entity.Infrastructure.AccessorExtensions.GetService [TService](IInfrastructure`1   访问者)   Microsoft.Data.Entity.RelationalDatabaseFacadeExtensions.GetRelationalConnection(DatabaseFacade   databaseFacade)at   Microsoft.Data.Entity.RelationalDatabaseFacadeExtensions.GetDbConnection(DatabaseFacade   databaseFacade)at   MY_APP.Portal.Startup.Configure(IApplicationBuilder app,   IHostingEnvironment env,ILoggerFactory loggerFactory)in   MY_APP / Startup.cs:第175行结果消息:一个或多个错误   发生了。没有类型的服务   &#39; Microsoft.Data.Entity.Storage.IRelationalConnection&#39;一直都是   注册。以下构造函数参数没有匹配   夹具数据:TestServerFixture testServerFixture

如果你想知道在MY_APP/Startup.cs(第175行)发生了什么:

 logger.LogInformation($"Using SQL Connection: {dbContext.Database.GetDbConnection().DataSource}");

使用&#39;正常&#39;数据库(即不是内存中的数据库)将通过测试。

所以看起来缺少一些依赖/布线?有人有这方面的经验吗?线索?等

1 个答案:

答案 0 :(得分:1)

在AspDotNet github上发布此问题之后,答案是来自EntityFramework本身的InMemoryDatabase本身不打算进行集成测试。

另一种方法是使用SQLite - 但后来也使用内存模式。

由于创建所有这些(从头开始到完全工作的集成测试)花了我很长时间才弄明白。我想我会在博客文章中将这一切都归结为:

http://www.stefanhendriks.com/2016/04/29/integration-testing-your-dot-net-core-app-with-an-in-memory-database/