2017-04-17 57 views
2

我有ASP.NET Core API。我已經通過文檔here瞭解如何在asp.net核心中進行集成測試。該示例設置了一個測試服務器,然後調用控制器方法。
但是我想直接測試一個特定的類方法(而不是控制器方法)?例如:解決ASP.NET Core集成測試中的依賴關係

public class MyService : IMyService 
    { 
     private readonly DbContext _dbContext; 

     public MyService(DbContext dbContext) 
     { 
      _dbContext = dbContext; 
     } 

     public void DoSomething() 
     { 
      //do something here 
     }    
    } 

當測試開始我想startup.cs被稱爲所以所有的依賴關係將會得到註冊。 (如dbcontext)但我不確定在集成測試中如何解決IMyService

注意:我想直接測試DoSomething()方法的原因是因爲此方法不會被任何控制器調用。我在此API中使用Hangfire進行後臺處理。 Hangfire的後臺處理工作將會調用DoSomething()方法。因此,對於集成測試,我希望避免使用Hangfire,並直接致電DoSomething()方法

回答

4

當您運行集成測試時,您已經有了TestServer,從這裏您可以輕鬆訪問應用程序範圍的容器。出於顯而易見的原因,您無法訪問RequestServices(它僅在HttpContext中可用,該請求會在每個請求中創建一次)。

var testServer = new TestServer(new WebHostBuilder() 
    .UseStartup<Startup>() 
    .UseEnvironment("DevelopmentOrTestingOrWhateverElse")); 

var myService = testServer.Host.Services.GetRequiredService<IMyService>(); 
+0

我用變種服務=(IMyService)_server.Host.Services.GetService(typeof運算(IMyService)); – LP13

+0

這是一樣的,擴展方法更方便,因爲您不需要進行強制類型轉換或執行任何空值檢查(如果服務無法解析,則返回GetRequiredService,因此名稱中必須包含**) – Tseng

+0

:)這就是爲什麼我無法找到它_server.Host.Services',幫助 – LP13