Тип конфликта при написании тестов NUnit - PullRequest
0 голосов
/ 27 мая 2019

Я получаю следующее предупреждение в VS Code при написании модульных тестов с NUnit:

Тип «MyClass» в «MyProject.cs» конфликтует с импортированным типом «MyClass» в «MyProject, версия = 0.0.0.0, Culture = нейтральный, PublicKeyToken = null». Используя тип, определенный в «Myproject \ Tests \ MyClass.cs». (CS0436) [Тесты]

Вот шаги, которые я сделал до сих пор:

  1. Переместился в нужную папку для всех проектов C # (например, E:\MyCSharpProjects).

  2. Создан новый консольный проект C # с помощью dotnet new console -o MyProject.

  3. Написал код.

  4. Выполнить следующую команду один раз: dotnet new -i NUnit3.DotNetNew.Template. Я предполагаю, что это устанавливает шаблоны проектов NUnit.

  5. Создана новая папка внутри корневой папки MyProject с именем Tests.

  6. Переместился в новую папку Tests и выполнил следующие команды:

    dotnet new nunit

    dotnet add reference ../MyProject.csproj

  7. Установлен пакет NUnit через NuGet на MyProject.csproj.

  8. Написал тестовый код.

ПРИМЕЧАНИЕ 1: Для MyProject.csproj и Tests.csproj я установил TargetFramework на netcoreapp2.2, потому что я пока не хочу использовать 3.0.

ПРИМЕЧАНИЕ 2: Чтобы избежать ошибок сборки, я прекращаю генерирование информации о сборке, добавляя следующие записи в PropertyGroup в оба моих файла .csproj:

<GenerateAssemblyInformationalVersionAttribute>false</GenerateAssemblyInformationalVersionAttribute>    
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>    
<GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>        
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>    
<GenerateAssemblyVersionAttribute>false</GenerateAssemblyVersionAttribute>
<GenerateAssemblyTitleAttribute>false</GenerateAssemblyTitleAttribute>

ПРИМЕЧАНИЕ 3: Ниже приведен мой файл MyProject.csproj:

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <GenerateAssemblyInformationalVersionAttribute>false</GenerateAssemblyInformationalVersionAttribute>
    <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
    <GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>
    <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
    <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
    <GenerateAssemblyVersionAttribute>false</GenerateAssemblyVersionAttribute>
    <GenerateAssemblyTitleAttribute>false</GenerateAssemblyTitleAttribute>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="NUnit" Version="*"/>
  </ItemGroup>

</Project>

ПРИМЕЧАНИЕ 4: Ниже приведен мой файл Tests.csproj:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <IsPackable>false</IsPackable>
    <GenerateAssemblyInformationalVersionAttribute>false</GenerateAssemblyInformationalVersionAttribute>    
    <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>    
    <GenerateAssemblyFileVersionAttribute>false</GenerateAssemblyFileVersionAttribute>        
    <GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
    <GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>    
    <GenerateAssemblyVersionAttribute>false</GenerateAssemblyVersionAttribute>
    <GenerateAssemblyTitleAttribute>false</GenerateAssemblyTitleAttribute>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="nunit" Version="*" />
    <PackageReference Include="NUnit3TestAdapter" Version="*" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="*" />
  </ItemGroup>

  <ItemGroup>    
    <ProjectReference Include="..\StudentService.csproj" />
  </ItemGroup>

</Project>

Предупреждение начало появляться после того, как я попытался сослаться на класс внутри моего Tests проекта под названием MyClass. Этот класс объявлен только внутри моего Tests проекта и не конфликтует с MyProject. Я, однако, прочитал, что это может быть вызвано Tests.csproj ссылкой на MyProject.csproj, находясь внутри MyProject.

Мой C # проект имеет следующую структуру:

E:\MyCSharpProjects
    MyProject
        MyProject.csproj
        <MyProject code files>
        Tests
            Tests.csproj
            <Tests code files>

Мои вопросы:

  1. Имеет ли тестовый проект, который ссылается на мой настоящий проект, единственный способ использовать NUnit?

  2. Есть ли способ иметь только 1 проект C #, в котором есть тесты NUnit, аналогично Java и JUnit?

  3. Я держу свой тестовый проект внутри моего реального проекта, чтобы они всегда были вместе. Это стандартная практика? А если нет, то что?

  4. Как мне избавиться от указанного предупреждения? Я не хочу игнорировать это, потому что мне не нравится, когда в моем коде есть предупреждения.

ОБНОВЛЕНИЕ: В случае, если мои вопросы слишком широки, чтобы ответить, ссылка на стандарты о том, как писать тесты NUnit от начала до конца, также будет полезна.


РЕЗЮМЕ: Ответ Десмонда сработал! Оказывается, все, что мне нужно было сделать, это добавить файл .sln в мой проект, и все работало отлично! Нет предупреждений и нет необходимости вообще отключать генерацию информации о сборке!

Большое спасибо всем, кто помог!

1 Ответ

1 голос
/ 27 мая 2019

См. Модульное тестирование C # с NUnit и .NET Core из .NET Core Guide.Они предлагают структуру каталогов, подобную этой:

/unit-testing-using-nunit
    unit-testing-using-nunit.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeService.Tests.csproj

Это обычно то, что я использовал и во всех моих проектах.

Что касается предупреждения, похоже, что вы определилиодин и тот же класс и пространство имен в обоих проектах.Пространство имен обычно должно отражать структуру каталогов, поэтому, если у вас есть проект с именем MyProject, тестовый проект с именем MyProject.Tests и класс с именем MyClass в каждом, я ожидал бы найти полные имена MyProject.MyClass и MyProject.Tests.MyClass,Еще лучше назвать тестовый класс MyClassTests или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...