使用NUnit编写单元测试时,我在VS代码中收到以下警告:
'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
通过NuGet在NUnit
上安装了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
引起的。
我的C#项目的结构如下:
E:\MyCSharpProjects
MyProject
MyProject.csproj
<MyProject code files>
Tests
Tests.csproj
<Tests code files>
我的问题是:
是否有一个引用我的实际项目的测试项目是使用NUnit的唯一方法?
是否有办法只在其中包含NUnit测试的1个C#项目,类似于Java和JUnit?
我将测试项目保留在实际项目中,因此它们始终在一起。这是标准做法吗?如果没有,那是什么?
如何摆脱上述警告?我不想忽略它,因为我不喜欢在代码中包含警告。
更新:如果我的问题太大而无法回答,那么有关如何从头到尾编写NUnit测试的标准链接也将很有用。
摘要: desmondgc's的答案有效!原来我要做的就是向项目添加一个.sln
文件,一切正常!没有警告,也不需要禁用所有的汇编信息!
非常感谢所有帮助过的人!
答案 0 :(得分:1)
请参阅.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
通常,这也是我在所有项目中都使用过的。
关于警告,听起来好像您在两个项目中都定义了相同的类和名称空间。命名空间通常应该反映目录结构,因此,如果您有一个名为MyProject的项目,一个名为MyProject.Tests的测试项目以及每个名为MyClass的类,则我希望找到完全限定的名称MyProject.MyClass
和{ {1}}。更好的是,调用测试类MyProject.Tests.MyClass
或类似的东西。