1

Vielleicht habe ich etwas verpasst, oder vielleicht ist etwas kaputt. Ich hoffe zu erfahren, was hier passiert.Bootstrapping TestServer mit TestStartup mit InMemoryDatabase schlägt fehl (.Net-Core)

TLDR: Bootstrapping eine TestServer Klasse mit einer InMemory-Datenbank, gibt (No service for type 'Microsoft.Data.Entity.Storage.IRelationalConnection' has been registered). Irgendwelche Hinweise? Details siehe unten:

ich eine Testklasse haben, die eine TestFixture verwendet Bootstrap:

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

Die testServerFixture sieht wie folgt aus: public class TestServerFixture: IDisposable { öffentlichen 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(); 
    } 
} 

Und wie man es nutzt ein TestPortalStartup die wie folgt aussieht sehen können: public class TestPortalStartup: Startup { privaten 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 
    } 

} 

Wie Sie im SetUpDataBaseAndMigrations sehen wir ein InMemoryDatabase und ein DbContext Bootstrap.

Ich habe dieses Konstrukt zuvor verwendet, um einen Dienst zu testen, der sich mit der Datenbank beschäftigt. (aber das ist isoliert).

nun mit einem Integrationstest ich am Ende scheitern mit den Test Bootstrap:

Ergebnis Stacktrace: bei Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService (IServiceProvider Anbieter, Typ Servicetype) bei Microsoft .Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService [T] (IServiceProvider Provider) bei Microsoft.Data.Entity.Infrastructure.AccessorExtensions.GetService [TService] (IInfrastructure`1 Accessor) bei Microsoft.Data.Ent ity.RelationalDatabaseFacadeExtensions.GetRelationalConnection (DatabaseFacade databaseFacade) bei Microsoft.Data.Entity.RelationalDatabaseFacadeExtensions.GetDbConnection (DatabaseFacade databaseFacade) bei MY_APP.Portal.Startup.Configure (IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) in MY_APP/Startup.cs: Zeile 175 Ergebnismeldung: Ein oder mehrere Fehler ist aufgetreten. Kein Dienst für den Typ 'Microsoft.Data.Entity.Storage.IRelationalConnection' wurde registriert. Die folgenden Konstruktorparameter nicht zueinander passende Fixturedaten: TestServerFixture testServerFixture

Im Fall fragt man sich, was bei MY_APP/Startup.cs (Linie 175) passiert, das ist:

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

Laufen mit einer ‚normalen‘ Datenbank (dh kein In Speicher 1) wird den Test bestehen.

So sieht es aus wie einige Abhängigkeiten/Verkabelung fehlt? Hat jemand Erfahrung damit? Hinweise? etc.

+0

eine SQLite statt inMemory Verwendung scheint zu funktionieren. Obwohl ich das nicht wollte. Also bleibt die Frage offen. –

Antwort

1

Nachdem ich diese Frage im AspDotNet GitHub veröffentlicht hatte, war die Antwort, dass die InMemoryDatabase von EntityFramework selbst nicht dazu gedacht ist, solche Integrationstests durchzuführen.

Eine Alternative ist SQLite - aber auch im Speichermodus.

Seit ich all dies erstellt habe (von der Arbeit bis hin zu voll funktionsfähigen Integrationstests) brauchte ich einige Zeit, um es herauszufinden. Ich dachte, ich würde summerise das alles in einem Blog-Post:

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

+0

der Blog ist auf .net Core 1.0 aktualisiert - Ich kann viele Leute aus Stackoverflow kommen sehen - ich hoffe es ist nützlich! –

Verwandte Themen