Не удается запустить тесты 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: