F# 如何设置可以使用 FsUnit 的 FAKE 项目
F# How to setup FAKE project that can use FsUnit
我正在尝试设置一个可以 运行 FsUnit 的基本 FAKE F# 项目,但我不知道如何解决 Method not found: 'Void FsUnit.TopLevelOperators.should(Microsoft.FSharp.Core.FSharpFunc`2<!!0,!!1>, !!0, System.Object)'
错误。
我已经阅读了以下似乎相关的帖子,但我显然仍然没有理解它:
我使用以下设置创建了一个 JunkTest
库项目:
paket.dependencies
source https://www.nuget.org/api/v2
nuget FAKE
nuget FSharp.Core
nuget FsUnit
nuget NUnit
nuget NUnit.Console
paket.references
FSharp.Core
FsUnit
NUnit
JunkTest.fs
module JunkTest
open FsUnit
open NUnit.Framework
[<Test>]
let ``Example Test`` () =
1 |> should equal 1 // this does not work
//Assert.That(1, Is.EqualTo(1)) // this works (NUnit)
build.fsx(相关部分)
Target "Test" (fun _ ->
!! (buildDir + "JunkTest.dll")
|> NUnit3 (fun p ->
{p with OutputDir = "TestResults" }
)
)
输出
我看到正在从本地 packages
目录复制 FSharp.Core.dll:Copying file from "c:\Users\dangets\code\exercism\fsharp\dgt\packages\FSharp.Core\lib\net40\FSharp.Core.dll" to "c:\Users\dangets\code\exercism\fsharp\dgt\build\FSharp.Core.dll".
和 nunit3-console 执行:c:\Users\dangets\code\exercism\fsharp\dgt\packages\NUnit.ConsoleRunner\tools\nunit3-console.exe "--noheader" "--output=TestResults" "c:\Users\dangets\code\exercism\fsharp\dgt\build\JunkTest.dll"
我试图在测试项目根目录中添加一个 app.config
文件,但它似乎没有解决问题(注意我没有使用 Visual Studio -我是否需要为项目做任何特别的事情来包含 app.config
文件?):
<?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.1.0" newVersion="4.3.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
感谢任何帮助。
编辑: 解决方案是我没有正确设置 App.config
文件以包含在构建中。所有说 "just add this to your App.config
file" 的答案都没有帮助我,因为 VSCode 不会自动将其添加到 fsproj
文件中。
我添加的部分是:
<None Include="App.config" />
在包含其他 <Compile Include=Foo.fs>
行的 ItemGroup
中。
这听起来像是 FSharp.Core 版本不匹配。
您使用的 NuGet 包随 FSharp.Core 4.4(而非 4.3.1)一起提供。我建议修改您的绑定重定向以使用 4.4:
<bindingRedirect oldVersion="0.0.0.0-4.3.1.0" newVersion="4.4.0.0" />
这是因为 FSharp.Core
版本不匹配。看,您的应用程序引用了 FSharp.Core
的一个版本,而 FsUnit
引用了另一个版本。这意味着 FSharpFunc<_,_>
类型对于您和 FsUnit
将是不同的(来自不同的程序集),这反过来意味着 FsUnit
导出的 should
函数是与您的代码正在寻找的功能不同,因为它具有不同类型的参数。
这就是 bindingRedirect
的用武之地。您绝对正确地将其添加到 app.config
,但是根据您关于是否正确执行的问题,我怀疑您也许不会。 app.config
的问题是,它实际上不是程序配置。相反,它是用于程序配置的源代码。在编译时,这个文件被复制到 bin\Debug\Your.Project.dll.config
,只有这样它才会在运行时被拾取。如果您没有将此文件添加到 fsproj
项目文件(我怀疑可能是这种情况),那么在构建期间它不会被复制到正确的位置,因此不会在运行时间。
它仍然无法正常工作的另一个原因可能是您在 app.config
文件中指定了不正确的 FSharp.Core
版本。这让我想到了下一点。
手工制作该文件有点脆弱:当您将 FSharp.Core
升级到新版本(或 Paket 为您完成)时,您可能会忘记在 app.config
中修复它,甚至如果你不这样做,那就有点麻烦了。但是 Paket 可以帮助您:如果您将 redirects: on
options 添加到 paket.dependencies
文件,Paket 会自动将 bindingRedirect
cruft 添加到您的 app.config
:
source https://www.nuget.org/api/v2
nuget FAKE
nuget FSharp.Core redirects: on
nuget FsUnit
nuget NUnit
nuget NUnit.Console
我正在尝试设置一个可以 运行 FsUnit 的基本 FAKE F# 项目,但我不知道如何解决 Method not found: 'Void FsUnit.TopLevelOperators.should(Microsoft.FSharp.Core.FSharpFunc`2<!!0,!!1>, !!0, System.Object)'
错误。
我已经阅读了以下似乎相关的帖子,但我显然仍然没有理解它:
我使用以下设置创建了一个 JunkTest
库项目:
paket.dependencies
source https://www.nuget.org/api/v2
nuget FAKE
nuget FSharp.Core
nuget FsUnit
nuget NUnit
nuget NUnit.Console
paket.references
FSharp.Core
FsUnit
NUnit
JunkTest.fs
module JunkTest
open FsUnit
open NUnit.Framework
[<Test>]
let ``Example Test`` () =
1 |> should equal 1 // this does not work
//Assert.That(1, Is.EqualTo(1)) // this works (NUnit)
build.fsx(相关部分)
Target "Test" (fun _ ->
!! (buildDir + "JunkTest.dll")
|> NUnit3 (fun p ->
{p with OutputDir = "TestResults" }
)
)
输出
我看到正在从本地 packages
目录复制 FSharp.Core.dll:Copying file from "c:\Users\dangets\code\exercism\fsharp\dgt\packages\FSharp.Core\lib\net40\FSharp.Core.dll" to "c:\Users\dangets\code\exercism\fsharp\dgt\build\FSharp.Core.dll".
和 nunit3-console 执行:c:\Users\dangets\code\exercism\fsharp\dgt\packages\NUnit.ConsoleRunner\tools\nunit3-console.exe "--noheader" "--output=TestResults" "c:\Users\dangets\code\exercism\fsharp\dgt\build\JunkTest.dll"
我试图在测试项目根目录中添加一个 app.config
文件,但它似乎没有解决问题(注意我没有使用 Visual Studio -我是否需要为项目做任何特别的事情来包含 app.config
文件?):
<?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.1.0" newVersion="4.3.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
感谢任何帮助。
编辑: 解决方案是我没有正确设置 App.config
文件以包含在构建中。所有说 "just add this to your App.config
file" 的答案都没有帮助我,因为 VSCode 不会自动将其添加到 fsproj
文件中。
我添加的部分是:
<None Include="App.config" />
在包含其他 <Compile Include=Foo.fs>
行的 ItemGroup
中。
这听起来像是 FSharp.Core 版本不匹配。
您使用的 NuGet 包随 FSharp.Core 4.4(而非 4.3.1)一起提供。我建议修改您的绑定重定向以使用 4.4:
<bindingRedirect oldVersion="0.0.0.0-4.3.1.0" newVersion="4.4.0.0" />
这是因为 FSharp.Core
版本不匹配。看,您的应用程序引用了 FSharp.Core
的一个版本,而 FsUnit
引用了另一个版本。这意味着 FSharpFunc<_,_>
类型对于您和 FsUnit
将是不同的(来自不同的程序集),这反过来意味着 FsUnit
导出的 should
函数是与您的代码正在寻找的功能不同,因为它具有不同类型的参数。
这就是 bindingRedirect
的用武之地。您绝对正确地将其添加到 app.config
,但是根据您关于是否正确执行的问题,我怀疑您也许不会。 app.config
的问题是,它实际上不是程序配置。相反,它是用于程序配置的源代码。在编译时,这个文件被复制到 bin\Debug\Your.Project.dll.config
,只有这样它才会在运行时被拾取。如果您没有将此文件添加到 fsproj
项目文件(我怀疑可能是这种情况),那么在构建期间它不会被复制到正确的位置,因此不会在运行时间。
它仍然无法正常工作的另一个原因可能是您在 app.config
文件中指定了不正确的 FSharp.Core
版本。这让我想到了下一点。
手工制作该文件有点脆弱:当您将 FSharp.Core
升级到新版本(或 Paket 为您完成)时,您可能会忘记在 app.config
中修复它,甚至如果你不这样做,那就有点麻烦了。但是 Paket 可以帮助您:如果您将 redirects: on
options 添加到 paket.dependencies
文件,Paket 会自动将 bindingRedirect
cruft 添加到您的 app.config
:
source https://www.nuget.org/api/v2
nuget FAKE
nuget FSharp.Core redirects: on
nuget FsUnit
nuget NUnit
nuget NUnit.Console