5

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

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

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

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

我将第 9、31-37 和 47 行添加到build.fsx来自 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

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

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

4

1 回答 1

2

你的项目有几个问题:

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

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

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

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

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

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

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

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

于 2016-10-28T00:21:59.317 回答