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

时间:2016-10-26 21:12:39

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

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

我已经创建了dummy project in Github作为示例。

最初,test目录不存在。我创建了test目录并在该文件夹中创建了第二个项目TestProj.Test(事后看来,我应该使用更多描述性名称)用于测试目的。我将.fsproj TestProj文件添加到此项目中,以便我可以引用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中的测试成功运行?或者,Tests.fs中的TestProj.Test文件是否有问题?这似乎特别困难;是否有更简单的方法来包含使用VSCode,Iondide和F#自动运行的测试?

1 个答案:

答案 0 :(得分:2)

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

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

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

  • 中移除paket.locktest
  • NUnit版本的有毒混合物 =>从NUnit.Framework删除对paket.dependencies的明确引用并运行paket.exe install

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

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

  • 如果您想使用NUnit3
    => open Fake.Testing并使用NUnit3代替NUnit

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

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