Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XUnit test project with only 1 Main method: "Program has more than one entry point defined."

I converted a vNext format .NET xUnit test project (with project.json) to the new .csproj format in Visual Studio 2017 RC and started getting the below error. Most of the online answers to this error say "You have two Main methods; get rid of one." This seems like an obvious solution, but this project has only one Main method.

Error:

CS0017 Program has more than one entry point defined. Compile with /main to specify the type that contains the entry point. Project.Name C:\path\to\Program.cs

Program.cs:

using XunitProgram = Xunit.Runner.DotNet.Program;

namespace My.Namespace.Tests
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            XunitProgram.Main(args);
        }
    }
}

Old project.json:

{
  "version": "1.0.0-*",
  "testRunner": "xunit",
    "buildOptions": {
        "emitEntryPoint": true,
        "preserveCompilationContext": true,
        "debugType": "full"
    },

    "dependencies": {
        "dotnet-test-xunit": "2.2.0",
        "xunit": "2.2.0",
        "Microsoft.DotNet.InternalAbstractions": "1.0.0"
    },
  "frameworks": {
    "net462": {}
  }
}

New Project.csproj:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net462</TargetFramework>
        <RuntimeIdentifier>win7-x86</RuntimeIdentifier>
        <DebugType>full</DebugType>
        <PreserveCompilationContext>true</PreserveCompilationContext>
        <AssemblyName>My.Project.Tests</AssemblyName>
        <OutputType>Exe</OutputType>
        <PackageId>My.Project.Tests</PackageId>
        <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
        <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
        <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
        <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
        <RootNamespace>My.Project.Tests</RootNamespace>
        <StartupObject />
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0-preview-20170106-08" />
        <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
        <PackageReference Include="xunit" Version="2.2.0" />
    </ItemGroup>

    <ItemGroup Condition=" '$(TargetFramework)' == 'net462' ">
        <Reference Include="System" />
        <Reference Include="Microsoft.CSharp" />
    </ItemGroup>

    <ItemGroup>
        <Folder Include="SampleInput\" />
    </ItemGroup>

</Project>
like image 317
J.D. Mallen Avatar asked Feb 21 '17 16:02

J.D. Mallen


2 Answers

This took a bit of tinkering to figure out. Upon migration to the new project format in VS 2017, Microsoft quietly added a dependency for Microsoft.NET.Test.Sdk, which I believe has its own Main method.

If you create a new xUnit Test Project in VS 2017 RC alongside the one that you had migrated, you will notice that it no longer creates a Program.cs with a Main method invoking the XUnit runner.

To fix this, delete your sole visible Main method. Your tests will still execute as normal, provided you have the above package references (Microsoft.NET.Test.Sdk, xunit.runner.visualstudio, xunit).

like image 113
J.D. Mallen Avatar answered Oct 30 '22 11:10

J.D. Mallen


For when you have a console application with tests in it I prefer this:

tl;dr; Add <GenerateProgramFile>false</GenerateProgramFile> inside a <PropertyGroup> element in your test project's .csproj file.

From:

https://andrewlock.net/fixing-the-error-program-has-more-than-one-entry-point-defined-for-console-apps-containing-xunit-tests/

like image 22
Dave Mateer Avatar answered Oct 30 '22 11:10

Dave Mateer