【问题标题】:Adding unit tests to a F# project in VSCode在 VSCode 中向 F# 项目添加单元测试
【发布时间】:2016-10-26 21:12:39
【问题描述】:

我正在使用 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 上读到测试项目需要是一个库而不是控制台应用程序。

我在默认的build.fsx file that comes from Ionide. 中添加了第 9、31-37 和 47 行。但是,当我构建整个项目(即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# 自动运行的测试?

【问题讨论】:

  • 您的 'Test' 目标正在寻找 'NUnit.Test.*.dll' 而 'TestProj.Test' 会生成一个同名的 dll。顺便说一句,您的项目结构还有一些其他可能的改进。如果你愿意,我会在 EOD WEST 之前提出 PR。
  • 要建立一个成熟的 F# 项目,包括文档,您可以查看ProjectScaffold
  • 我以前使用过 ProjectScaffold,但其中包含的内容太多,我不需要也不理解。我希望避免这种情况,但如果我无法自行启动并运行测试框架,我可能不得不使用它。另外,也许现在还为时过早,但我不明白您在这里使用的缩写“PR”、“EOD”和“WEST”。请解释一下?
  • 对不起,那堵缩写墙 :-) PR = Pull R为您的存储库请求,EOD = End Of Day,WEST =西欧夏令时间。答案有帮助吗?
  • 您的评论帮助微乎其微,但那是因为我不明白所有部分是如何组合在一起的!也可以,PR 会很有帮助!

标签: unit-testing f# visual-studio-code f#-fake ionide


【解决方案1】:

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

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

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

  • 有毒的 NUnit 版本组合
    => 从paket.dependencies 中删除对NUnit.Framework 的显式引用并运行paket.exe install

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 2019-01-12
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多