我对(可能)XUnit和许多Nuget软件包有这个非常令人困惑的问题。我的解决方案由一个与此问题无关的 C# 项目和一个 F# 测试项目组成。
测试项目是一个非常简单的类库项目,其中包含一个 .fs 文件,其中包含所有测试和一些 NuGet 包,其中三个 (IMO) 很重要:版本 1.4.1.0 中的fsUnitxUnit
、版本 2.1.0 中的XUnit
和版本 4.0.0.1 中的FSharp.Core
。
问题是,当满足以下两个条件时,测试始终在Could not load file or assembly FSharp.Core, Version=4.3.1.0
失败:NuGet 引用FSharp.Core
的版本为 4.0.0。[10],项目类型是类库。
当 NuGet FSharp.Core
手动降级到版本 3.1.2.5 或项目类型更改为控制台应用程序时,不会引发异常,并且所有测试都按预期通过。
好像这还不够奇怪,它只在Windows上这样做。在Linux(或至少travis-cl(如此处所示))上,每个配置中都运行良好。
此处链接的是测试存储库。最后三个提交显示哪些配置有效,哪些配置无效。最后一个"也有效"配置没有适当的travis配置文件,但也适用于Windows和Travis(测试通过)。
免责声明:我绝对是NuGet包的新手,所以我可能会错过一些非常基本的东西。
问题是 FsUnit.xUnit 引用 FSharp.Core 4.3.1.0,而您的项目使用的是不同的版本。
您应该能够使用绑定重定向来解决此问题。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
...
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
我相信你应该能够把它放到你的测试项目的app.config中,xunit应该找到并使用生成的.dll.config文件。我会先尝试一下。否则,您可以将绑定重定向放入 xunit.console.exe.config 中,以便在运行 xunit.console.exe 时使用它。