编写NUnit测试时发生类型冲突

时间:2019-05-27 07:00:16

标签: c# nunit warnings

使用NUnit编写单元测试时,我在VS代码中收到以下警告:

'MyProject.cs'中的'MyClass'类型与'MyProject,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'中导入的类型'MyClass'冲突。使用在“ Myproject \ Tests \ MyClass.cs”中定义的类型。 (CS0436)[测试]

这些是我到目前为止所采取的步骤:

  1. 已导航到所有C#项目的期望文件夹(例如E:\MyCSharpProjects)。

  2. 通过dotnet new console -o MyProject创建了一个新的C#控制台项目。

  3. 写了一些代码。

  4. 一次运行以下命令:dotnet new -i NUnit3.DotNetNew.Template。我假设这将安装NUnit项目模板。

  5. MyProject的根文件夹Tests中创建了一个新文件夹。

  6. 在新的Tests文件夹中导航,并运行以下命令:

    dotnet new nunit

    dotnet add reference ../MyProject.csproj

  7. 通过NuGet在NUnit上安装了MyProject.csproj软件包。

  8. 编写了一些测试代码。

注1:对于MyProject.csprojTests.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. 是否有办法只在其中包含NUnit测试的1个C#项目,类似于Java和JUnit?

  3. 我将测试项目保留在实际项目中,因此它们始终在一起。这是标准做法吗?如果没有,那是什么?

  4. 如何摆脱上述警告?我不想忽略它,因为我不喜欢在代码中包含警告。

更新:如果我的问题太大而无法回答,那么有关如何从头到尾编写NUnit测试的标准链接也将很有用。


摘要: desmondgc's的答案有效!原来我要做的就是向项目添加一个.sln文件,一切正常!没有警告,也不需要禁用所有的汇编信息!

非常感谢所有帮助过的人!

1 个答案:

答案 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或类似的东西。