如何使用新的 csproj 格式在 NUnit 测试中创建 HttpConfiguration 实例?

How can I create an instance of HttpConfiguration in a NUnit test using the new csproj format?

我创建了一个单元测试(使用 NUnit),它创建了一个 HttpConfiguration 的实例,它使用经典的 csproj 格式工作正常。测试成功。我还使用新的 csproj 格式创建了一个单元测试(使用 xUnit)来执行相同的操作。这个测试也成功了。

到目前为止一切顺利。实际上,我想使用新的 csproj 格式创建一个 NUnit 测试。此测试失败,抛出 System.IO.FileLoadException 引用 Newtonsoft.Json,Version=6.0.0.0 .

我觉得这很奇怪。在我所有的测试项目中,除了引用的单元测试框架之外,我还添加了两个包:Microsoft.AspNet.WebApi.Core 5.2.7Newtonsoft.Json 12.0。 3 .

这是我失败测试的 csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net472</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.7" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
    <PackageReference Include="NUnit" Version="3.2.0" />
  </ItemGroup>

</Project>

这是在旧项目格式中成功而在新项目格式中失败的单元测试。

[Test]
public void CreateInstance()
{
    var instance = new HttpConfiguration();
}

这是我的测试结果:

我真的很惊讶。我使用旧的 csproj 格式对 NUnit 进行了测试。当使用 xUnit 和新的 csproj 格式时,我的测试也成功了。因此,我使用哪种格式或框架都无关紧要。但是,当我将 NUnit 与新格式结合使用时,测试失败了。这怎么可能,我怎样才能做到这一点? Newtonsoft.Json 的版本 12.0.3 不会阻止其他 2 项测试,因此对于失败的测试也不应该。

我的代码也可以找到on GitHub

您的 NUnit“OldStyle”项目引用了 Newtonsoft.Json 版本 6.0.4。这就是它工作的原因 - 这个版本是用 Microsoft.AspNet.WebApi.Core 安装的,所以没有冲突。您的“NewStyle”项目正在引用 Newtonsoft.Json 版本 12.0.3,并且与相同版本的 Microsoft.AspNet.WebApi.Core 存在冲突。

如果您在“OldStyle”项目中将 Newtonsoft.Json 升级到最新版本,它将在 app.config:

中为您创建绑定重定向
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

将此配置复制到您的“NewStyle”项目,一切都会按预期工作。