2017-04-17 10 views
2

私はASP.NET Core APIを持っています。私はすでにasp.netコアで統合テストを行う方法を示す文書hereを見てきました。この例では、テストサーバーを設定してからコントローラメソッドを呼び出します。
しかし、(コントローラメソッドではなく)特定のクラスメソッドを直接テストしたいですか?たとえば:ASP.NETコアの統合テストにおける依存関係の解決

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にアクセスすることはできません(リクエストごとに1回作成されるHttpContextでのみ利用可能です)。

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

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

iが(IMyService)_server.Host.Services.GetService(typeof演算(IMyService))= VARサービスを使用します。 – LP13

+0

それと同じですが、拡張メソッドは、キャストやヌルチェックを行う必要がないので便利です( 'サービスを解決できない場合はGetRequiredServiceがスローされますので、その名前に** Required **が付きます) – Tseng

+0

それは私が '_server.Host.Services'で見つけられなかった理由です。 – LP13

関連する問題