Ответ 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), мы получим вышеуказанную ошибку.