Не удается запустить тесты XUnit с.NET Core

Я портирую небольшую библиотеку, имеющуюся в NuGet, на.NET Core.

Я создал библиотеки классов.NET Standard 1.6 для основного проекта и тестов и скопировал код. Я изменил модульные тесты, чтобы использовать атрибуты и утверждения XUnit, а не NUnit.

Кроме этого, я в значительной степени следовал инструкциям в документации, поэтому я добавил следующие пакеты NuGet:

  • Microsoft.NET.Test.Sdk
  • XUnit
  • xunit.runner.visualstudio

Увы, (1) Test Explorer не находит мои модульные тесты, и (2) когда я запускаю dotnet testЯ получаю следующее:

При запуске теста, пожалуйста, подождите... Не удалось найти testhost.dll для источника '[...].Tests.dll'. Убедитесь, что у тестового проекта есть ссылка Nuget на пакет "microsoft.testplatform.testhost".

Я фактически добавил предложенный Microsoft.TestPlatform.TestHost Пакет NuGet, но это ничего не изменило.

Так в чем здесь проблема?

Я использую VS2017. Не то чтобы я думаю, что это имеет значение.

Обновление: изменение тестового проекта с Class Library (.NET Standard) в Class Library (.NET Core) исправил проблему. Я до сих пор не понимаю, почему это должно иметь значение.

1 ответ

Решение

Изменение тестового проекта с библиотеки классов (.NET Standard) на библиотеку классов (.NET Core) решило проблему. Я до сих пор не понимаю, почему это должно иметь значение.

Модульные тесты - это приложения, которые мы запускаем. Чтобы построить такое приложение, мы должны указать среду выполнения и модель приложения. Когда мы ориентируемся на.NET Standard, среда выполнения и модель приложения неоднозначны; MSBuild не знает, следует ли выполнять сборку на основе.NET Framework, .NET Core, Mono/Xamarin или другой платформы, соответствующей стандарту.NET. Таргетинг.NET Core предоставляет необходимые данные для MSBuild, который теперь знает, как разрешить все упомянутые сборки / проекты и выбрать соответствующую версию платформы.

Но это никогда не было так. В прошлом вы всегда использовали библиотеку классов для модульных тестов; это никогда не считалось приложением, которое вы могли бы запустить, а скорее набором классов и методов, которые вы передавали бы тестирующему.

В прошлом у нас не было.NET Standard, что является неоднозначной целью. Когда MSBuild видит.NET Standard, ему нужно больше информации. "Хорошо, какую среду выполнения, совместимую со стандартом.NET, вы хотите использовать для создания работоспособного вывода?" Если, например, мы были нацелены netstandard1.2то MSBuild не будет знать, следует ли выполнять сборку на основе.NET Core 1.0, .NET Framework 4.5.1, Windows 8.1 или нескольких других netstandard1.2 совместимые платформы.

введите описание изображения здесь

При запуске теста, пожалуйста, подождите... Не удалось найти testhost.dll для источника '[...].Tests.dll'. Убедитесь, что у тестового проекта есть ссылка Nuget на пакет "microsoft.testplatform.testhost".

Если мы не укажем netcoreappЗатем MSBuild предполагает, что мы используем полную структуру. В этом случае он ожидает целевые сборки, в том числе testhost.dllбыть в bin, Если это не так (и не будет, если мы построили против.NET Standard), мы получим вышеуказанную ошибку.

Моя проблема была такой же, с сообщением в Output> Test console:

Microsoft.VisualStudio.TestPlatform.ObjectModel.TestPlatformException:
Unable to find [test-dir]\bin\Debug\netcoreapp3.1\testhost.dll.
Please publish your test project and retry.

у меня есть xUnit тест на основе пакетов:

  • xunit (2.4.1)
  • xunit.runner.visualstudio (2.4.2)

Что мне помогает:

  • удалить пакет:Microsoft.NET.Test.Sdk
  • установить пакет:Microsoft.TestPlatform.TestHost

Теперь работает и даже быстрее!

Все пакеты тестовых проектов на основе xUnit в VS.NET:

В диспетчере пакетов NuGet:

Другие вопросы по тегам