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.
eine SQLite statt inMemory Verwendung scheint zu funktionieren. Obwohl ich das nicht wollte. Also bleibt die Frage offen. –