编写 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) [测试]

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

  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. MyProject.csproj.

  8. 上通过 NuGet 安装了 NUnit
  9. 写了一些测试代码。

注意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>

当我尝试在名为 MyClassTests 项目中引用 class 时,警告开始出现。此 class 仅在我的 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. 有没有办法让 1 个 C# 项目内部有 NUnit 测试,类似于 Java 和 JUnit?

  3. 我将我的测试项目保存在我的实际项目中,以便它们始终在一起。这是标准做法吗?如果不是,那是什么?

  4. 如何消除上述警告?我不想忽略它,因为我不喜欢在我的代码中出现警告。

更新: 如果我的问题太宽泛而无法回答,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.MyClassMyProject.Tests.MyClass。更好的是,调用测试 class MyClassTests 或类似的东西。