A single test code that targets multiple frameworks at once using .NET Core and xUnit

I have some .NET Core libraries that target net45 and netstandard1.6 , and I want to test them. I did dotnet new -t xunittest and created a new test project targeting netcoreapp1.0 so that it only tests .NET Core code.

I also tried compiling it to target net45 as net45 , but then I got a series of errors when detecting tests. My questions

Is there a way to test the code intended for both (possibly later) frameworks with one test project, or should I create a test project for each of them that I am aiming at?

Edit : here are my project.json and the messages I get:

 { "version": "1.0.0-*", "buildOptions": { "debugType": "portable" }, "dependencies": { "xunit": "2.1.0" }, "testRunner": "xunit", "frameworks": { "net45": { "frameworkAssemblies": { "System.Runtime": "4.0.0.0" } }, "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0" }, "System.Runtime.Serialization.Primitives": "4.1.1", "dotnet-test-xunit": "2.2.0-preview2-build1029" }, "imports": [ "dotnet5.4", "portable-net451+win8" ] } } } 

these are the errors that I get after compiling the project:

 dotnet-test Error: 0 : [ReportingChannel]: Waiting for message failed System.IO.IOException: Unable to read data om the transport connection: An established connection was aborted by the software in your host machine. ---> stem.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) --- End of inner exception stack trace --- at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) at System.IO.Stream.ReadByte() at System.IO.BinaryReader.ReadByte() at System.IO.BinaryReader.Read7BitEncodedInt() at System.IO.BinaryReader.ReadString() at Microsoft.DotNet.Tools.Test.ReportingChannel.ReadMessages() >dotnet-test Error: 0 : Unhandled Exception: System.IO.IOException: Unable to read data from the transport nnection: An established connection was aborted by the software in your host machine. ---> stem.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) --- End of inner exception stack trace --- at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) at System.IO.Stream.ReadByte() at System.IO.BinaryReader.ReadByte() at System.IO.BinaryReader.Read7BitEncodedInt() at System.IO.BinaryReader.ReadString() at Microsoft.DotNet.Tools.Test.ReportingChannel.ReadMessages() at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object ate) [ReportingChannel]: Error sending System.IO.IOException: Unable to write data to the transport connection: Cannot cess a disposed object. Object name: 'System.Net.Sockets.Socket'.. ---> System.ObjectDisposedException: Cannot access a disposed object. Object name: 'System.Net.Sockets.Socket'. at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, cketError& errorCode) at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size) --- End of inner exception stack trace --- at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size) at System.IO.BinaryWriter.Write7BitEncodedInt(Int32 value) at System.IO.BinaryWriter.Write(String value) at Microsoft.DotNet.Tools.Test.ReportingChannel.Send(Message message) dotnet-test Error: 0 : System.IO.IOException: Unable to write data to the transport connection: Cannot access a sposed object. Object name: 'System.Net.Sockets.Socket'.. ---> System.ObjectDisposedException: Cannot access a disposed object. Object name: 'System.Net.Sockets.Socket'. at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, cketError& errorCode) at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size) --- End of inner exception stack trace --- at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size) at System.IO.BinaryWriter.Write7BitEncodedInt(Int32 value) at System.IO.BinaryWriter.Write(String value) at Microsoft.DotNet.Tools.Test.ReportingChannel.Send(Message message) at Microsoft.DotNet.Tools.Test.ReportingChannel.SendError(String error) at Microsoft.DotNet.Tools.Test.ReportingChannel.SendError(Exception ex) at Microsoft.DotNet.Tools.Test.DesignTimeRunner.HandleDesignTimeMessages(ProjectContext projectContext, tnetTestParams dotnetTestParams) at Microsoft.DotNet.Tools.Test.DesignTimeRunner.DoRunTests(ProjectContext projectContext, DotnetTestParams tnetTestParams) at Microsoft.DotNet.Tools.Test.BaseDotnetTestRunner.RunTests(ProjectContext projectContext, DotnetTestParams tnetTestParams, BuildWorkspace workspace) at Microsoft.DotNet.Tools.Test.TestCommand.DoRun(String[] args) 

and ends with this line

 ========== Discover test finished: 0 found (0:00:03.0417342) ========== 

although I know that I have one test (at least for now).

however, if I remove the net 45 links, everything works like a charm, here is my project.json job:

 { "version": "1.0.0-*", "buildOptions": { "debugType": "portable" }, "dependencies": { "System.Runtime.Serialization.Primitives": "4.1.1", "xunit": "2.1.0", "dotnet-test-xunit": "2.2.0-preview2-build1029" }, "testRunner": "xunit", "frameworks": { "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0" } }, "imports": [ "dotnet5.4", "portable-net451+win8" ] } } } 
+7
unit-testing .net-core
source share
2 answers

According to xUnit.NET Core docs ,

You can target both net4xx and netcoreapp by simply adding both structures together to the project.json file. When you run dotnet test with multiple framework entries, the system will run all your infrastructure tests one by one.

This does not mean that you can have one link to a test project and a test project designed for different platforms (for example, the .NET 4.5 project and the .NET Core project). But this means that you can test projects focused on the same set of platforms.

For example, I have a class library designed for .NET 4.5.1 and .NET Core:

 { "dependencies": { "NETStandard.Library": "1.6.0" }, "frameworks": { "netstandard1.6": {}, "net451": {} }, "version": "1.0.0-*" } 

I can target net451 and netcoreapp1.0 in my test project and reference this class library:

 { "buildOptions": { "debugType": "portable" }, "dependencies": { "xunit": "2.2.0-beta2-build3300", "dotnet-test-xunit": "2.2.0-preview2-build1029", "NetStandardClassLibrary": { "target": "project" } }, "frameworks": { "net451": {}, "netcoreapp1.0": { "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0" } }, "imports": [ "dotnet5.4", "portable-net451+win8" ] } }, "testRunner": "xunit", "version": "1.0.0-*" } 

When the dotnet test , the tests will run twice (once for each target platform):

 Ξ» dotnet test Project NetStandardClassLibrary (.NETStandard,Version=v1.6) was previously compiled. Skipping compilation. Project XunitBothFrameworks (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation. xUnit.net .NET CLI test runner (64-bit .NET Core win81-x64) Discovering: XunitBothFrameworks Discovered: XunitBothFrameworks Starting: XunitBothFrameworks Finished: XunitBothFrameworks === TEST EXECUTION SUMMARY === XunitBothFrameworks Total: 1, Errors: 0, Failed: 0, Skipped: 0, Time: 0.244s Project NetStandardClassLibrary (.NETFramework,Version=v4.5.1) was previously compiled. Skipping compilation. Project XunitBothFrameworks (.NETFramework,Version=v4.5.1) was previously compiled. Skipping compilation. xUnit.net .NET CLI test runner (64-bit Desktop .NET win81-x64) Discovering: XunitBothFrameworks Discovered: XunitBothFrameworks Starting: XunitBothFrameworks Finished: XunitBothFrameworks === TEST EXECUTION SUMMARY === XunitBothFrameworks Total: 1, Errors: 0, Failed: 0, Skipped: 0, Time: 0.201s SUMMARY: Total: 2 targets, Passed: 2, Failed: 0. 

When I tried to run the tests inside Visual Studio, I got a similar error message. I think this is an error because the dotnet test on the command line worked fine.

+5
source share

For me below, project.json worked beautifully, I didn't have to run the test from cmd .

 { "version": "0.1.0-*", "dependencies": { "Moq": "4.5.22", "xunit": "2.2.0-beta2-build3300", "dotnet-test-xunit": "2.2.0-preview2-build1029", "IntegraPay.Domain": { "version": "1.0.0-*","target": "project" }, "Integrapay.RegistrationApplication": { "version": "", "target": "project" } }, "frameworks": { "netcoreapp1.0": { "imports": [ "net451" ], "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.0.0" } } } }, "testRunner": "xunit" } 
+1
source share

All Articles