2017-02-21 40 views
3

Я преобразовал проект тестирования .NET xUnit в формате vNext (с project.json) в новый формат .csproj в Visual Studio 2017 RC и начал получать следующую ошибку. Большинство онлайн-ответов на эту ошибку говорят: «У вас есть два основных метода: избавитесь от одного». Это кажется очевидным решением, но этот проект имеет только один Основной метод.XUnit тестовый проект только с одним основным методом: «Программа имеет более чем одну точку входа».

Ошибка:

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> 

ответ

6

Это заняло немного мастерить, чтобы выяснить. При переходе на новый формат проекта в VS 2017 Microsoft спокойно добавила зависимость для Microsoft.NET.Test.Sdk, которая, как я полагаю, имеет свой собственный метод Main.

Если вы создаете новый проект тестирования xUnit в VS 2017 RC вместе с тем, который вы перенесли, вы заметите, что он больше не создает Program.cs с методом Main, вызывающим бегуна XUnit.

Чтобы исправить это, удалите свой единственный видимый Основной метод. Ваши тесты все равно будут выполняться в обычном режиме, если у вас есть указанные выше ссылки на пакеты (Microsoft.NET.Test.Sdk, xunit.runner.visualstudio, xunit).

+1

Спасибо за это. У меня есть проект с использованием MSTest, который я только что открыл в VS2017 и перенесен в csproj, который показал ту же проблему. – Nick

+1

Спасибо! У меня есть тесты xunit, запеченные в моем веб-приложении для внутреннего материала, и до сих пор получили это без разумных объяснений. – Yablargo

0

Ни один из моих проектов xunit (тип netcoreapp) имеет основной метод. Основной метод предоставляется xunit. Ваш Program.cs не был необходим с project.json в первую очередь. Теперь, csproj, это, кажется, продвигается к ошибке.

Просмотреть оригинал xunit documentation и найти Главная.

+0

все еще это сообщение не должно происходить. Не должен ли каждый консольный проект содержать тесты xunit и основной метод? – MushyPeas

+1

Нет, потому что проект отражает программный модуль (сборка в .NET). Единичные тесты являются артефактом развития, подобным, например, создавать файлы. Они не должны развертываться в производственной среде, поскольку они обычно не выполняют какую-либо цель, а создают риск. – Thomas

0

У меня была аналогичная проблема. Проверьте, добавлена ​​ли опция конфигурации AddCommandLine (args) в ConfigurationBuilder.

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

Удалить запись. Это вызвало мою проблему ...

Надеюсь, это поможет