Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Integration and unit tests no longer work on ASP.NET Core 2.1 failing to find assemblies at runtime

When creating test projects or upgrading an application and tests to ASP.NET Core 2.1 / .NET Core 2.1, running tests fails with assembly load exceptions like

System.IO.FileNotFoundException : Could not load file or assembly 'Microsoft.AspNetCore, Version=2.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.

When adding references to some other libraries there are also build warnings like

warning MSB3277: Found conflicts between different versions of "Microsoft.Extensions.Options" that could not be resolved.
warning MSB3277: Found conflicts between different versions of "Microsoft.Extensions.Configuration.Abstractions" that could not be resolved.
warning MSB3277: Found conflicts between different versions of "Microsoft.AspNetCore.Hosting.Abstractions" that could not be resolved.
warning MSB3277: Found conflicts between different versions of "Microsoft.Extensions.DependencyInjection.Abstractions" that could not be resolved.
warning MSB3277: Found conflicts between different versions of "Microsoft.AspNetCore.Http.Abstractions" that could not be resolved.
warning MSB3277: Found conflicts between different versions of "Microsoft.AspNetCore.Http.Features" that could not be resolved.

How can I make test projects work for testing ASP.NET Core 2.1 applications?

like image 509
Martin Ullrich Avatar asked May 17 '18 22:05

Martin Ullrich


People also ask

Which package component can be added for integration testing of the .NET core API applications?

AspNetCore. Mvc. Testing package is used to configure the test host and test server, the TestHost and TestServer packages don't require direct package references in the test app's project file or developer configuration in the test app.

What is WebApplicationFactory?

WebApplicationFactory is a class dedicated to creating an in-memory application for use in integration and end-end testing. We can create a class that inherits from WebApplicationFactory and it will handle bootstrapping TestServer and giving us back a HttpClient that can be used for making requests.


1 Answers

Update: This has been made easier with 2.2 Tooling. Make sure that your dotnet --version SDK version is at least 2.2.100, even when buidling 2.1 applications

Just add a versionless package reference to your project while keeping the 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> 

Original:

ASP.NET Core 2.1 uses a new "shared framework" to run ASP.NET Core applications on. Test projects need to be modified/updated to also use this shared framework using one of the following approaches:

  1. Change the test project's <Project> tag in the first line to use the web SDK (Microsoft.NET.Sdk.Web instead of Microsoft.NET.Sdk) and add a package reference to Microsoft.AspNetCore.App (or .All if you are using that inside the web project) without specifying a version

    The project file (.csproj) of the test project should now look like this:

    <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. Alternative: Leave the Sdk as-is and add a PackageReference to the shared framework package but specify a version.

    This can be done by simply adding a NuGet reference to Microsoft.AspNetCore.App. However, this may cause issues since the SDK may choose to update the reference when a new patch release of the ASP.NET Core is released and the tooling is updated to reflect this. You will need update the NuGet reference for every patch release.

like image 111
Martin Ullrich Avatar answered Sep 22 '22 00:09

Martin Ullrich