F#如何设置可以使用FsUnit的FAKE项目

Dan*_*y G 6 f# fsunit f#-fake visual-studio-code

我正在尝试设置一个可以运行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
Run Code Online (Sandbox Code Playgroud)

paket.references

FSharp.Core
FsUnit
NUnit
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

build.fsx(相关部分)

Target "Test" (fun _ ->
    !! (buildDir + "JunkTest.dll")
    |> NUnit3 (fun p ->
        {p with OutputDir = "TestResults" }
    )
)
Run Code Online (Sandbox Code Playgroud)

产量

我看到正在从本地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>
Run Code Online (Sandbox Code Playgroud)

任何和所有的帮助表示赞赏.

编辑:解决方案是我没有正确设置App.config文件以包含在构建中.所有说"只是将其添加到您的App.config文件" 的答案对我没有帮助,因为VSCode不会fsproj自动将其添加到文件中.

我添加的部分是:

<None Include="App.config" />
Run Code Online (Sandbox Code Playgroud)

ItemGroup那包含其他<Compile Include=Foo.fs>行.

Fyo*_*kin 5

发生这种情况是因为FSharp.Core版本不匹配。请注意,您的应用程序引用了一个版本FSharp.CoreFsUnit引用了另一个版本。这意味着FSharpFunc<_,_>您 和 的类型将会不同(来自不同的程序集)FsUnit,这又意味着should导出的函数与FsUnit您的代码正在查找的函数不同,因为它具有不同类型的参数。

这就是bindingRedirect进来的地方。您绝对正确地将其添加到app.config,但是从您关于是否正确执行的问题来看,我怀疑您可能不会。问题app.config是,它实际上不是程序配置。相反,它是程序配置的源代码。在编译时,该文件被复制到bin\Debug\Your.Project.dll.config,只有这样它才会在运行时被拾取。如果您没有将此文件添加到fsproj项目文件中(我怀疑可能是这种情况),那么在构建过程中它不会被复制到正确的位置,因此在运行时不会被拾取。

FSharp.Core它仍然无法工作的另一个原因可能是您在文件中指定了不正确的版本app.config。这让我想到了下一点。

手工制作该文件有点脆弱:当您升级FSharp.Core到新版本(或 Paket 为您完成)时,您可能会忘记修复它app.config,即使您不这样做,也会有点麻烦。但是 Paket 可以帮助您:如果您将选项添加redirects: on文件中paket.dependencies,Paket 会自动将这些bindingRedirect选项添加到您的文件中app.config

source https://www.nuget.org/api/v2
nuget FAKE
nuget FSharp.Core redirects: on
nuget FsUnit
nuget NUnit
nuget NUnit.Console
Run Code Online (Sandbox Code Playgroud)