Интеграция и модульные тесты больше не работают на 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", которые не могут быть разрешены.
предупреждение MSB3277: обнаружены конфликты между различными версиями "Microsoft.Extensions.Configuration.Abstractions", которые не могут быть разрешены.
предупреждение MSB3277: обнаружены конфликты между различными версиями "Microsoft.AspNetCore.Hosting.Abstractions", которые не могут быть решены.
предупреждение MSB3277: обнаружены конфликты между различными версиями "Microsoft.Extensions.DependencyInjection.Abstractions", которые не могут быть решены.
предупреждение MSB3277: обнаружены конфликты между различными версиями "Microsoft.AspNetCore.Http.Abstractions", которые не могут быть разрешены.
warning MSB3277: обнаружены конфликты между различными версиями "Microsoft.AspNetCore.Http.Features", которые не могут быть разрешены.

Как я могу заставить тестовые проекты работать для тестирования приложений ASP.NET Core 2.1?

Ответ 1

Обновление: это стало проще с 2.2 Tooling. Убедитесь, что ваша 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> тестового проекта в первой строке, чтобы использовать веб-SDK (Microsoft.NET.Sdk.Web вместо Microsoft.NET.Sdk) и добавить ссылку на пакет в Microsoft.AspNetCore.App (или. .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. Однако это может вызвать проблемы, поскольку SDK может решить обновить ссылку, когда будет выпущен новый выпуск исправлений для ядра ASP.NET, и обновлены инструменты, чтобы отразить это. Вам нужно будет обновить ссылку NuGet для каждого выпуска патча.

Ответ 2

Вопрос касается ASP.NET Core 2.1, но для тех, кто сталкивается с той же проблемой с ASP.NET Core 2.2, достаточно добавить следующее в файл тестового проекта:

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

Больше нет необходимости устанавливать Sdk="Microsoft.NET.Sdk.Web", и вам не следует добавлять версию в приведенную выше ссылку на пакет - это вызывает предупреждение.

Ответ 3

У меня была такая же проблема. Добавьте это в тестовый проект, решив проблему

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