我使用VSCode和Ionide套件来在F#中创建控制台应用程序。我需要向应用程序添加单元测试,以便在项目ctrl+shift+p FAKE: Build
时,测试在构建过程中运行。
我已经创建了dummy project in Github作为示例。
最初,test
目录不存在。我创建了test
目录并在该文件夹中创建了第二个项目TestProj.Test
(事后看来,我应该使用更多描述性名称)用于测试目的。我将.fsproj
TestProj
文件添加到此项目中,以便我可以引用SimpleFunctions.fs
。 NUnit.Framework
和FsUnit
已添加到TestProj.Test
。 Test.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#
自动运行的测试?
答案 0 :(得分:2)
您的项目中存在一些问题:
在构建"Clean" ==> "Test" ==> "Build" ==> "Deploy"
之前尝试测试
=>将目标依赖项更改为"Clean" ==> "Build" ==> "Test" ==> "Deploy"
单独进行测试的paket配置(paket.dependencies,test
子文件夹中的paket.lock),这会导致引用的依赖项的版本不一致
=>从paket.dependencies
paket.lock
和test
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
我建议您使用预定义模板或从小处开始,确保了解每个步骤并检查它是否按预期工作。一旦你遇到了非工作解决方案的问题,就很难重回正轨。