web-dev-qa-db-ja.com

統合および単体テストは、実行時にアセンブリを見つけることができないASP.NET Core 2.1で動作しなくなりました

テストプロジェクトを作成するか、アプリケーションとテストをASP.NET Core 2.1/.NET Core 2.1にアップグレードすると、次のようなアセンブリロード例外でテストの実行が失敗する

System.IO.FileNotFoundException:ファイルまたはアセンブリ 'Microsoft.AspNetCore、Version = 2.1.0.0、Culture = neutral、PublicKeyToken = adb9793829ddae60'をロードできませんでした。システムは、指定されたファイルを見つけることができません。

他のライブラリへの参照を追加するとき、次のようなビルド警告もあります。

警告MSB3277:解決できなかった「Microsoft.Extensions.Options」の異なるバージョン間の競合が見つかりました。
warning MSB3277:解決できなかった「Microsoft.Extensions.Configuration.Abstractions」の異なるバージョン間の競合が見つかりました。
警告MSB3277:解決できなかった「Microsoft.AspNetCore.Hosting.Abstractions」の異なるバージョン間の競合が見つかりました。
警告MSB3277:解決できなかった「Microsoft.Extensions.DependencyInjection.Abstractions」の異なるバージョン間の競合が見つかりました。
警告MSB3277:解決できなかった「Microsoft.AspNetCore.Http.Abstractions」の異なるバージョン間の競合が見つかりました。
警告MSB3277:解決できなかった「Microsoft.AspNetCore.Http.Features」の異なるバージョン間の競合が見つかりました。

ASP.NET Core 2.1アプリケーションのテスト用にテストプロジェクトを機能させるにはどうすればよいですか?

39
Martin Ullrich

更新:これは2.2ツーリングで簡単になりました。 dotnet --version SDKバージョンが少なくとも2.2.100であることを確認してください2.1アプリケーションをビルドする場合でも

Microsoft.NET.Sdkを保持しながら、バージョンレスパッケージ参照をプロジェクトに追加するだけです。

    <Project Sdk="Microsoft.NET.Sdk">

      <PropertyGroup>
        <TargetFramework>netcoreapp2.1</TargetFramework>
      </PropertyGroup>

      <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="2.1.1" />
        <PackageReference Include="Microsoft.AspNetCore.App" />
        <!-- other references to xunit, test SDK etc. -->
      </ItemGroup>

      <ItemGroup>
        <ProjectReference Include="..\AspNetCoreAppToTest\AspNetCoreAppToTest.csproj" />
      </ItemGroup>

    </Project>

元の:

ASP.NET Core 2.1は、新しい「共有フレームワーク」を使用してASP.NET Coreアプリケーションを実行します。次の方法のいずれかを使用して、この共有フレームワークを使用するように、テストプロジェクトを変更/更新する必要があります。

  1. 最初の行のテストプロジェクトの<Project>タグを変更して、Web SDK(Microsoft.NET.Sdk.WebではなくMicrosoft.NET.Sdk)を使用し、パッケージ参照をMicrosoft.AspNetCore.App(またはWebプロジェクト内で使用している場合は.All)に追加しますバージョンを指定せずに

    テストプロジェクトのプロジェクトファイル(.csproj)は、次のようになります。

    <Project Sdk="Microsoft.NET.Sdk.Web">
    
      <PropertyGroup>
        <TargetFramework>netcoreapp2.1</TargetFramework>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="2.1.1" />
        <PackageReference Include="Microsoft.AspNetCore.App" />
        <!-- other references to xunit, test SDK etc. -->
      </ItemGroup>
    
      <ItemGroup>
        <ProjectReference Include="..\AspNetCoreAppToTest\AspNetCoreAppToTest.csproj" />
      </ItemGroup>
    
    </Project>
    
  2. 代替方法:Sdkをそのままにして、PackageReferenceを共有フレームワークパッケージに追加しますが、バージョンを指定します。

    これは、NuGet参照をMicrosoft.AspNetCore.Appに追加するだけで実行できます。ただし、ASP.NET Coreの新しいパッチリリースがリリースされたときにSDKが参照の更新を選択し、これを反映するようにツールが更新されるため、これにより問題が発生する可能性があります。パッチリリースごとにNuGetリファレンスを更新する必要があります。

66
Martin Ullrich

質問はASP.NET Core 2.1を指定していますが、ASP.NET Coreで同じ問題に直面している人2.2は、テストに以下を追加するだけで十分です。プロジェクトファイル:

<PackageReference Include="Microsoft.AspNetCore.App" />

必要なしSdk="Microsoft.NET.Sdk.Web"を設定するためにあり、not上記のパッケージ参照にバージョンを追加する必要があります-これは警告を引き起こします。

3
EM0