Конфликт типов при написании тестов NUnit

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

Тип «MyClass» в «MyProject.cs» конфликтует с импортированным типом «MyClass» в «MyProject, версия = 0.0.0.0, культура = нейтральная, 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.

Мой проект С# структурирован следующим образом:

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. Как еще вы хотите протестировать то, на что вы не ссылаетесь? 2. Это полностью зависит от вашей собственной реализации. Если хотите, можете записать все в одну сборку. 3. слишком основанный на мнении. Не буду рекомендовать, жестко. 4. Не знаю. Сказав все это, ваш вопрос слишком широк.

MakePeaceGreatAgain 27.05.2019 09:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
130
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

См. Модульное тестирование C# с помощью NUnit и .NET Core в руководстве по .NET Core. Они предлагают такую ​​структуру каталогов:

/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 или что-то в этом роде.

Действительно, мои тестовые коды уже отражают структуру каталогов (MyProject.Tests и т. д.), поэтому предупреждение вызывает дополнительное недоумение. У меня такое чувство, что вы не получаете никаких предупреждений, потому что вы используете .sln внутри VS Studio вместо того, чтобы иметь несколько .csproj файлов внутри VS Code. Возможно, VS Code все-таки не подходит для разработки на C#?

Floating Sunfish 27.05.2019 10:00

Я постараюсь следовать инструкциям по предоставленной вами ссылке и на этот раз создать файл .sln. Надеюсь, это заставит предупреждение исчезнуть. :)

Floating Sunfish 27.05.2019 10:03

Эй, это сработало! Оказывается, я был на правильном пути — мне просто не хватало подходящего .sln файла, чтобы скрепить мои .csproj файлы. Большое спасибо за ссылку!

Floating Sunfish 28.05.2019 16:13

Другие вопросы по теме