集成和单元测试不再适用于无法在运行时找到程序集 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.扩展.选项"之间的冲突。
警告MSB3277:发现无法解决的不同版本的"Microsoft.扩展.配置.抽象"之间的冲突。
警告MSB3277:发现无法解决不同版本的"Microsoft.AspNetCore.Hosting.Abstractions"之间的冲突。
警告MSB3277:发现无法解决的不同版本的"Microsoft.Extensions.DependencyInjection.Abstractions"之间的冲突。
警告MSB3277:发现无法解决不同版本的"Microsoft.AspNetCore.Http.Abstractions"之间的冲突。
警告MSB3277:发现无法解决不同版本的"Microsoft.AspNetCore.Http.Features"之间的冲突。

如何使测试项目用于测试 Core 2.1 应用程序 ASP.NET?

更新使用 2.2 工具使这变得更容易。确保您的dotnet --versionSDK版本至少为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="..AspNetCoreAppToTestAspNetCoreAppToTest.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="..AspNetCoreAppToTestAspNetCoreAppToTest.csproj" />
    </ItemGroup>
    </Project>
    
  2. 替代方法:将Sdk保留原样,并向共享框架包添加PackageReference,但指定版本。

    只需将 NuGet 引用添加到Microsoft.AspNetCore.App即可完成此操作。但是,这可能会导致问题,因为 SDK 可能会选择在发布 ASP.NET Core 的新修补程序版本时更新引用,并且更新工具以反映这一点。你将需要更新每个修补程序版本的 NuGet 参考。

该问题指定了 ASP.NET Core 2.1,但对于那些在 Core2.2中遇到相同问题 ASP.NET,将以下内容添加到测试项目文件中就足够了:

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

无需再设置Sdk="Microsoft.NET.Sdk.Web",也不应将版本添加到上面的包引用中 - 这会导致警告。

我遇到了同样的问题。将此添加到测试项目解决了问题

<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.1"/>

最新更新