也許我錯過了某些東西,或者可能是某個東西壞了。我希望找出發生在這裏的事情。帶有帶有InMemoryDatabase的TestStartup的引導測試服務器失敗(.Net核心)
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的 { 公共TESTSERVER服務器{獲得; }
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:啓動 { 私人模擬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
看到我們的引導和InMemoryDatabase
一個DbContext
。
我之前使用過這個構造來測試一個處理數據庫的服務。 (但這是孤立的)。
與集成測試,我最終沒能引導與測試現在:在 微軟在 Microsoft.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService(IServiceProvider的 提供商,類型的serviceType):
結果堆棧跟蹤.Extensions.DependencyInjection.ServiceProviderExtensions.GetRequiredService [T](的IServiceProvider 提供商)在 Microsoft.Data.Entity.Infrastructure.AccessorExtensions.GetService [TService](IInfrastructure`1 存取)在 Microsoft.Data.Ent ity.RelationalDatabaseFacadeExtensions.GetRelationalConnection(DatabaseFacade databaseFacade)在 Microsoft.Data.Entity.RelationalDatabaseFacadeExtensions.GetDbConnection(DatabaseFacade databaseFacade)在 MY_APP.Portal.Startup.Configure(IApplicationBuilder應用程序, IHostingEnvironment ENV,ILoggerFactory的LoggerFactory)在 my_app應用/ Startup.cs:第175行結果消息:發生了一個或多個錯誤 。 沒有服務'Microsoft.Data.Entity.Storage.IRelationalConnection'已註冊 。下面的構造函數的參數沒有匹配 夾具數據:TestServerFixture testServerFixture
如果你想知道在MY_APP/Startup.cs
(線175),這是發生了什麼:
logger.LogInformation($"Using SQL Connection: {dbContext.Database.GetDbConnection().DataSource}");
與「正常」運行數據庫(即不是內存中的一個)將通過測試。
因此,它看起來像一些依賴項/接線丟失?任何人都有這方面的經驗?線索?等等
如何使用SQLite的,而不是inMemory似乎工作。雖然這不是我想要的。所以問題仍然存在。 –