1

也許我錯過了某些東西,或者可能是某個東西壞了。我希望找出發生在這裏的事情。帶有帶有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}"); 

與「正常」運行數據庫(即不是內存中的一個)將通過測試。

因此,它看起來像一些依賴項/接線丟失?任何人都有這方面的經驗?線索?等等

+0

如何使用SQLite的,而不是inMemory似乎工作。雖然這不是我想要的。所以問題仍然存在。 –

回答

1

當我在AspDotNet github上發佈這個問題後,答案是EntityFramework本身的InMemoryDatabase並不意味着要做這樣的集成測試。

另一種方法是使用SQLite - 但也是在內存模式下。由於創建所有這些(從頭開始到完全正常工作的集成測試)花了我相當長的一段時間才弄清楚。我想我會summerise這一切在一篇博客文章:

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

+0

博客更新爲.net核心1.0 - 我可以看到很多人來自於stackoverflow - 我希望它是有用的! –