I'm porting a small library that I have on NuGet to .NET Core.
I've created .NET Standard 1.6 class libraries for the main project and the tests, and copied over the code. I changed the unit tests to use XUnit attributes and asserts rather than NUnit.
Other than that I pretty much followed the instructions in the documentation, thus I added the following NuGet packages:
- Microsoft.NET.Test.Sdk
- xunit
- xunit.runner.visualstudio
Alas, (1) Test Explorer does not find my unit tests, and (2) when I run dotnet test
, I get the following:
Starting test execution, please wait... Could not find testhost.dll for source '[...].Tests.dll'. Make sure test project has a nuget reference of package "microsoft.testplatform.testhost".
I have actually added the suggested Microsoft.TestPlatform.TestHost
NuGet package, but that hasn't changed anything.
So what is the problem here?
I'm using VS2017. Not that I think it makes a difference.
Update: changing the test project from Class Library (.NET Standard)
to Class Library (.NET Core)
fixed the problem. I still don't get why this is supposed to make a difference.
Unit tests are applications that we run. To build such an application, we must specify a runtime and application model. When we target .NET Standard, the runtime and application model are ambiguous; MSBuild does not know whether to build against .NET Framework, .NET Core, Mono/Xamarin, or another .NET Standard compliant platform. Targeting .NET Core provides the required input to MSBuild, which now knows how to resolve all the referenced assemblies/projects and choose the appropriate framework version.
In the past we did not have .NET Standard, which is an ambiguous target. When MSBuild sees .NET Standard it needs more information. "Okay, which .NET Standard compliant runtime do you want to use to produce the runable output?" If for instance we had targeted
netstandard1.2
, then MSBuild would not know whether to build against .NET Core 1.0, .NET Framework 4.5.1, Windows 8.1, or the several othernetstandard1.2
compliant platforms.If we do not specify
netcoreapp
, then MSBuild assumes that we are using the full framework. In that case, it expects the target assemblies, includingtesthost.dll
, to be in thebin
. If they are not (and they will not be if we built against .NET Standard), then we will receive the above error.