Я получаю следующее предупреждение в VS Code при написании модульных тестов с помощью NUnit:
Тип «MyClass» в «MyProject.cs» конфликтует с импортированным типом «MyClass» в «MyProject, версия = 0.0.0.0, культура = нейтральная, PublicKeyToken = null». Используя тип, определенный в «Myproject\Tests\MyClass.cs». (CS0436) [Тесты]
Вот шаги, которые я предпринял до сих пор:
Перешел в нужную папку для всех проектов C# (например, E:\MyCSharpProjects
).
Создал новый консольный проект C# через dotnet new console -o MyProject
.
Написал код.
Выполните следующую команду один раз: dotnet new -i NUnit3.DotNetNew.Template
. Я предполагаю, что это устанавливает шаблоны проектов NUnit.
Создал новую папку внутри корневой папки MyProject
под названием Tests
.
Переместился в новую папку Tests
и выполнил следующие команды:
dotnet new nunit
dotnet add reference ../MyProject.csproj
Установил пакет NUnit
через NuGet на MyProject.csproj
.
Написал тестовый код.
ПРИМЕЧАНИЕ 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>
Мои вопросы:
Является ли наличие тестового проекта, который ссылается на мой реальный проект, единственным способом использования NUnit?
Есть ли способ иметь только 1 проект C#, в котором есть тесты NUnit, аналогичные Java и JUnit?
Я держу свой тестовый проект внутри моего фактического проекта, поэтому они всегда вместе. Это стандартная практика? А если нет, то что?
Как избавиться от указанного предупреждения? Я не хочу игнорировать это, потому что мне не нравятся предупреждения в моем коде.
Обновлено: В случае, если мои вопросы слишком широки, чтобы на них можно было ответить, также была бы полезна ссылка на стандарты о том, как писать тесты NUnit от начала до конца.
Ответ РЕЗЮМЕ:Десмондгс сработал! Оказывается, все, что мне нужно было сделать, это добавить файл .sln
в мой проект, и все заработало отлично! Никаких предупреждений и вообще не нужно отключать генерацию информации о сборке!
Большое спасибо всем, кто помог!
См. Модульное тестирование 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#?
Я постараюсь следовать инструкциям по предоставленной вами ссылке и на этот раз создать файл .sln
. Надеюсь, это заставит предупреждение исчезнуть. :)
Эй, это сработало! Оказывается, я был на правильном пути — мне просто не хватало подходящего .sln
файла, чтобы скрепить мои .csproj
файлы. Большое спасибо за ссылку!
1. Как еще вы хотите протестировать то, на что вы не ссылаетесь? 2. Это полностью зависит от вашей собственной реализации. Если хотите, можете записать все в одну сборку. 3. слишком основанный на мнении. Не буду рекомендовать, жестко. 4. Не знаю. Сказав все это, ваш вопрос слишком широк.