如何使用新的 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.7 和 Newtonsoft.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”项目,一切都会按预期工作。
我创建了一个单元测试(使用 NUnit),它创建了一个 HttpConfiguration
的实例,它使用经典的 csproj 格式工作正常。测试成功。我还使用新的 csproj 格式创建了一个单元测试(使用 xUnit)来执行相同的操作。这个测试也成功了。
到目前为止一切顺利。实际上,我想使用新的 csproj 格式创建一个 NUnit 测试。此测试失败,抛出 System.IO.FileLoadException
引用 Newtonsoft.Json,Version=6.0.0.0 .
我觉得这很奇怪。在我所有的测试项目中,除了引用的单元测试框架之外,我还添加了两个包:Microsoft.AspNet.WebApi.Core 5.2.7 和 Newtonsoft.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”项目,一切都会按预期工作。