将单元测试添加到VSCode中的F#项目

Ste*_*ven 5 f# unit-testing f#-fake visual-studio-code ionide

我正在使用VSCode和Ionide套件来在F#中创建一个控制台应用程序.我需要向应用程序添加单元测试,以便ctrl+shift+p FAKE: Build在项目完成时,测试在构建过程中运行.

在Github中创建了一个虚拟项目作为示例.

最初,test目录不存在.我创建了testdir并在该文件夹中创建了第二个项目TestProj.Test(事后看来,我应该使用更多的描述性名称)用于测试目的.我将.fsproj文件添加TestProj到此项目中,以便我可以参考SimpleFunctions.fs. NUnit.FrameworkFsUnit添加到TestProj.Test. Test.fs包含两个简单的测试.

我故意创建了TestProj.Test一个F#,library因为我在SO上读到测试项目需要是一个库而不是一个控制台应用程序.

我将第build.fsx9,31-37和47行添加到来自Ionide的默认文件中..但是,当我构建整个项目(即TestProj)时,构建失败,我收到以下错误:

  1) System.Exception: NUnit: cannot run tests (the assembly list is empty).
   at Fake.NUnitSequential.NUnit(FSharpFunc`2 setParams, IEnumerable`1 assemblies) in C:\code\fake\src\app\FakeLib\UnitTest\NUnit\Sequential.fs:line 22
   at FSI_0005.Build.clo@31-3.Invoke(Unit _arg3)
   at Fake.TargetHelper.runSingleTarget(TargetTemplate`1 target) in C:\code\fake\src\app\FakeLib\TargetHelper.fs:line 492
Run Code Online (Sandbox Code Playgroud)

Sequential.fs建议的第22行assemblies是空的.

我究竟做错了什么?我应该如何设置build.fsx文件以使测试TestProj.test成功运行?或者,该Tests.fs文件有问题TestProj.Test吗?这似乎特别困难; 是否有更简单的方法来包含使用VSCode,Iondide和F#?自动运行的测试?

Car*_*Dev 2

您的项目存在一些问题:

  • 尝试在构建之前进行测试"Clean" ==> "Test" ==> "Build" ==> "Deploy"
    => 将目标依赖项更改为"Clean" ==> "Build" ==> "Test" ==> "Deploy"

  • 用于测试的单独包配置(test子文件夹中的 paket.dependency、paket.lock)这会导致引用的依赖项的版本不一致
    => 删除paket.dependenciespaket.locktest

  • NUnit 版本的有毒组合=> 删除对from
    的显式引用并运行NUnit.Frameworkpaket.dependenciespaket.exe install

  • 测试项目中的类型扩展无效
    =>更改type Test()或删除无用的文件

  • 构建创建所有项目(而不仅仅是src/app)的输出./build,但测试在 => 中查找 DLL ./test
    => 将测试文件模式更改为buildDir + "**/*.Test.dll"

  • 如果你想使用 NUnit3
    =>open Fake.Testing并使用NUnit3而不是NUnit

最后,你应该提交 paket.bootstrapper.exe

我建议您使用预定义的模板或从小处开始,确保您理解每个步骤并检查它是否按预期工作。一旦你遇到了一个不起作用的解决方案,就很难回到正轨。