0

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

到现在为止还挺好。实际上,我想使用新的 csproj 格式创建一个 NUnit 测试。该测试因抛出对Newtonsoft.Json, Version=6.0.0.0System.IO.FileLoadException的引用而失败。

我觉得这真的很奇怪。在我所有的测试项目中,除了提到的单元测试框架之外,我还添加了两个包: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 个测试的阻碍,因此它也不应该适用于失败的测试。

我的代码也可以在 GitHub 上找到

4

1 回答 1

1

您的 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”项目中,一切都会按预期工作。

于 2020-07-18T21:18:03.860 回答