web-dev-qa-db-ja.com

コントローラーがasp.netコアアプリの別のアセンブリにある場合、TestServerがコントローラーを検出できないのはなぜですか?

何らかの理由で、ASP.NETコアコントローラーが別のアセンブリで作成されている場合、クライアントが要求を行うと、TestServerはコントローラーアクションを見つけることができません。(404応答の結果)これはなぜですか。どうすれば回避できますか?再現する手順は次のとおりです。

  1. .NET Coreを使用して新しいASP.NET Core WebAPIを作成する
  2. 別のプロジェクトで統合テストを作成し、TestServer()クライアントを使用するようにテストを構成して、テストが正常に機能するようにします。
  3. 次に、コントローラーを独自の共有ライブラリに分離し、手順1で作成したプロジェクトをリファクタリングして、この共有ライブラリを代わりに使用します。
  4. TestServer()クラスを含むテストを再実行します。失敗したことに気づくでしょう。

統合テストの作成については、次のリンクを参照してください。 ASP.NET Coreを使用した統合テスト

27
jbooker

実際に私は今のところ解決策を見つけました、以下のdiffを参照してください: enter image description here

これは、TestServer()クラスのバグであり、テスト実行中にアプリケーションをどのようにホストしているかのように思われます。

上記の画像が読めない場合のコード行は次のとおりです

.AddApplicationPart(Assembly.Load(new AssemblyName("WebApiToReproduceBug.Controllers"))); 
32
joey

Joeyの回答に加えて、このバグを解決するためにAssembly.Load()を呼び出す必要はありません。以下のコードを使用できます。 ServiceHookControllerは別のプロジェクトのクラスです。


public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddApplicationPart(typeof(ServiceHookController).Assembly);
}
8
Karel Kral

MSドキュメントの 前提条件 に従うと、個別のアセンブリのコントローラーが読み込まれます。

私の場合、追加 Microsoft.AspNetCore.Mvc.Testing NuGetパッケージ で問題が修正され、AddApplicationPartを呼び出す必要がなくなりました。

2
beskuet