只有 1 个主要方法的 XUnit 测试项目:"Program has more than one entry point defined."

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

我在 Visual Studio 2017 RC 中将 vNext 格式的 .NET xUnit 测试项目(使用 project.json)转换为新的 .csproj 格式并开始出现以下错误。这个错误的大多数在线答案都说 "You have two Main methods; get rid of one." 这似乎是一个显而易见的解决方案,但这个项目只有一个 Main 方法。

错误:

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);
        }
    }
}

旧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": {}
  }
}

新建 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>

这需要一些修改才能弄清楚。迁移到 VS 2017 中的新项目格式后,Microsoft 悄悄地添加了 Microsoft.NET.Test.Sdk 的依赖项,我相信它有自己的 Main 方法。

如果您在 VS 2017 RC 中创建一个新的 xUnit 测试项目以及您已迁移的项目,您会注意到它不再创建一个 Program.cs 以及调用 XUnit 运行程序的 Main 方法。

要解决此问题,请删除您唯一可见的 Main 方法。您的测试仍将正常执行,前提是您有上述包引用(Microsoft.NET.Test.Sdkxunit.runner.visualstudio, xunit).

我的 xunit 项目(类型 netcoreapp)的

None 有一个 main 方法。主要方法由xunit提供。首先,您的 Program.cs 对于 project.json 是不必要的。现在,使用 csproj,这似乎升级为错误。

查看原始 xunit documentation 并搜索 main.

我遇到了类似的问题。检查您是否已将 AddCommandLine(args) 配置选项添加到您的 ConfigurationBuilder 中。例如

var config = new ConfigurationBuilder()
            .AddCommandLine(args)
            .AddEnvironmentVariables(prefix: "ASPNETCORE_")
            .Build();

删除条目。这导致了我的问题...

希望对您有所帮助

当你有一个带有测试的控制台应用程序时,我更喜欢这个:

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

发件人:

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