在 VSCode 中向 F# 项目添加单元测试

Adding unit tests to a F# project in VSCode

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

我创建了一个 dummy project in Github 作为示例。

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

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

我将第 9、31-37 和 47 行添加到默认 build.fsx file that comes from 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

Line 22 of the Sequential.fs 表示 assemblies 为空。

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

您的项目中存在一些问题:

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

  • 用于测试的单独数据包配置(paket.dependencies、paket.lock 在 test 子文件夹中)导致引用依赖项的版本不一致
    => 从 test

  • 中删除 paket.dependenciespaket.lock
  • NUnit 版本的有害组合
    => 从 paket.dependencies 和 运行 paket.exe install

  • 中删除对 NUnit.Framework 的明确引用
  • 测试项目中的类型扩展无效
    => 更改为 type Test() 或删除无用文件

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

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

最后,你应该commit paket.bootstrapper.exe

我建议您要么使用预定义的模板,要么从小处着手,确保您了解每个步骤并检查它是否按预期工作。一旦你 运行 超过了一个无效的解决方案,就很难回到正轨。