编写 NUnit 测试时类型冲突
Type Conflict While Writing NUnit Tests
我在使用 NUnit 编写单元测试时在 VS Code 中收到以下警告:
'MyProject.cs'中的类型'MyClass'与'MyProject, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'中导入的类型'MyClass'冲突。使用 'Myproject\Tests\MyClass.cs' 中定义的类型。 (CS0436) [测试]
这些是我到目前为止采取的步骤:
导航到我想要的所有 C# 项目文件夹(例如 E:\MyCSharpProjects
)。
通过 dotnet new console -o MyProject
创建了一个新的 C# 控制台项目。
写了一些代码。
运行以下命令一次:dotnet new -i NUnit3.DotNetNew.Template
。我假设这会安装 NUnit 项目模板。
在 MyProject
的根文件夹中创建了一个名为 Tests
的新文件夹。
在新的 Tests
文件夹中导航并 运行 以下命令:
dotnet new nunit
dotnet add reference ../MyProject.csproj
在 MyProject.csproj
.
上通过 NuGet 安装了 NUnit
包
写了一些测试代码。
注意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>
当我尝试在名为 MyClass
的 Tests
项目中引用 class 时,警告开始出现。此 class 仅在我的 Tests
项目中声明,与 MyProject
没有任何名称冲突。然而,我读到这可能是由于 Tests.csproj
引用 MyProject.csproj
而位于 MyProject
.
内引起的
我的C#项目结构如下:
E:\MyCSharpProjects
MyProject
MyProject.csproj
<MyProject code files>
Tests
Tests.csproj
<Tests code files>
我的问题是:
是否有一个引用我的实际项目的测试项目是使用 NUnit 的唯一方法?
有没有办法让 1 个 C# 项目内部有 NUnit 测试,类似于 Java 和 JUnit?
我将我的测试项目保存在我的实际项目中,以便它们始终在一起。这是标准做法吗?如果不是,那是什么?
如何消除上述警告?我不想忽略它,因为我不喜欢在我的代码中出现警告。
更新: 如果我的问题太宽泛而无法回答,link 关于如何从头到尾编写 NUnit 测试的标准也会很有用。
总结: desmondgc's 回答有效!原来我需要做的就是将 .sln
文件添加到我的项目中,一切都完美无缺!没有警告,根本不需要禁用程序集信息生成!
非常感谢所有帮助过的人!
请参阅 .NET Core 指南中的 Unit testing C# with NUnit and .NET Core。他们提出了这样的目录结构:
/unit-testing-using-nunit
unit-testing-using-nunit.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Test Source Files
PrimeService.Tests.csproj
这也是我在所有项目中通常使用的。
关于警告,听起来您在两个项目中定义了相同的 class 和命名空间。命名空间通常应该反映目录结构,所以如果你有一个名为 MyProject 的项目,一个名为 MyProject.Tests 的测试项目和一个名为 MyClass 的 class,我希望找到 fully-qualified姓名 MyProject.MyClass
和 MyProject.Tests.MyClass
。更好的是,调用测试 class MyClassTests
或类似的东西。
我在使用 NUnit 编写单元测试时在 VS Code 中收到以下警告:
'MyProject.cs'中的类型'MyClass'与'MyProject, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'中导入的类型'MyClass'冲突。使用 'Myproject\Tests\MyClass.cs' 中定义的类型。 (CS0436) [测试]
这些是我到目前为止采取的步骤:
导航到我想要的所有 C# 项目文件夹(例如
E:\MyCSharpProjects
)。通过
dotnet new console -o MyProject
创建了一个新的 C# 控制台项目。写了一些代码。
运行以下命令一次:
dotnet new -i NUnit3.DotNetNew.Template
。我假设这会安装 NUnit 项目模板。在
MyProject
的根文件夹中创建了一个名为Tests
的新文件夹。在新的
Tests
文件夹中导航并 运行 以下命令:dotnet new nunit
dotnet add reference ../MyProject.csproj
在
MyProject.csproj
. 上通过 NuGet 安装了 写了一些测试代码。
NUnit
包
注意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>
当我尝试在名为 MyClass
的 Tests
项目中引用 class 时,警告开始出现。此 class 仅在我的 Tests
项目中声明,与 MyProject
没有任何名称冲突。然而,我读到这可能是由于 Tests.csproj
引用 MyProject.csproj
而位于 MyProject
.
我的C#项目结构如下:
E:\MyCSharpProjects
MyProject
MyProject.csproj
<MyProject code files>
Tests
Tests.csproj
<Tests code files>
我的问题是:
是否有一个引用我的实际项目的测试项目是使用 NUnit 的唯一方法?
有没有办法让 1 个 C# 项目内部有 NUnit 测试,类似于 Java 和 JUnit?
我将我的测试项目保存在我的实际项目中,以便它们始终在一起。这是标准做法吗?如果不是,那是什么?
如何消除上述警告?我不想忽略它,因为我不喜欢在我的代码中出现警告。
更新: 如果我的问题太宽泛而无法回答,link 关于如何从头到尾编写 NUnit 测试的标准也会很有用。
总结: desmondgc's 回答有效!原来我需要做的就是将 .sln
文件添加到我的项目中,一切都完美无缺!没有警告,根本不需要禁用程序集信息生成!
非常感谢所有帮助过的人!
请参阅 .NET Core 指南中的 Unit testing C# with NUnit and .NET Core。他们提出了这样的目录结构:
/unit-testing-using-nunit
unit-testing-using-nunit.sln
/PrimeService
Source Files
PrimeService.csproj
/PrimeService.Tests
Test Source Files
PrimeService.Tests.csproj
这也是我在所有项目中通常使用的。
关于警告,听起来您在两个项目中定义了相同的 class 和命名空间。命名空间通常应该反映目录结构,所以如果你有一个名为 MyProject 的项目,一个名为 MyProject.Tests 的测试项目和一个名为 MyClass 的 class,我希望找到 fully-qualified姓名 MyProject.MyClass
和 MyProject.Tests.MyClass
。更好的是,调用测试 class MyClassTests
或类似的东西。