在F#中编写脚本文件的测试

nic*_*las 5 tdd f# xunit

我有一些脚本文件的功能,setup.fsx我想测试那些.xUnit和类似需要测试的函数是程序集的一部分.

所以我想将我的脚本从setup.fsx重命名为setup.fs扩展名,然后从另一个脚本文件加载它.但后来我的脚本依赖于

#r "System.Xml"
#r "System.Xml.Linq"
Run Code Online (Sandbox Code Playgroud)

然后我必须在调用脚本中指定(远离依赖实际出现的位置)

无论如何都要在xUnit worflow中集成基于脚本的测试吗?建议用什么组织编写脚本文件的测试?

(可能我们需要一个visual studio扩展,用于脚本中的测试而不是汇编...)

Tom*_*cek 2

即使您只是将fsx脚本添加到 Visual Studio,您仍然可以setup.fsx与其他(可能)文件一起编译成普通项目fs,因此您应该能够将脚本保留为 Visual Studio 中的普通脚本文件,同时,从项目或构建测试的命令行工具引用它。

我尝试使用以下test.fsx文件执行此操作:

module Demo
#r "System.Xml.Linq.dll"
open System.Xml.Linq

let test () = 
    let d = XDocument(XElement(XName.Get("foo")))
    d.ToString()
Run Code Online (Sandbox Code Playgroud)

您肯定需要module Name在开始时进行一些声明(以便您可以从其他文件访问函数),但除此之外它可以是任何fsx文件。我使用的另一个文件是test.fs:

module Main
open Demo    
test() |> printfn "%A"
Run Code Online (Sandbox Code Playgroud)

这仅用于测试,但您可以在这里编写单元测试。如果使用以下命令编译文件,您将获得可以传递给 xUnit 的标准程序集(注意,编译器可以#r从中选择标签test.fsx,我们不必显式编写引用):

fsc.exe --target:library test.fsx test.fs
Run Code Online (Sandbox Code Playgroud)

我认为如果您添加一个库项目,然后使用文件中类似的内容手动添加到该文件的链接(它可以指向解决方案结构中其他位置的文件),您可以在 Visual Studio 中获得相同的配置fsproj:

<Compile Include="..\Eslewhere\In\Your\Project\Tree\File.fsx">
  <Link>File.fsx</Link>
</Compile>
Run Code Online (Sandbox Code Playgroud)

请注意,当您fsx使用“添加项目”添加文件时,它被标记为“包含”而不是“编译”,因此它不会被编译为项目的一部分。上面应该将其包含在项目中,并且它应该告诉编译器将其也包含在已编译的程序集中。

警告:也就是说,我认为dll使用标准单元测试来测试刚刚编译的文件可能会更好。如果您想测试fsx文件,我只需在末尾添加几行作为测试并手动运行它们(选择,Alt+ Enter)。原因是fsx文件应该经常更改,因此过于可靠的测试可能会限制您的灵活性。另一方面,一旦代码变得更加可靠,将其移动到dll文件中就有意义了。

  • 如果您在 fsx 中将模块写在上面,则无法在 fsi 中执行它。添加 #if COMPILED 模块演示 #endif 似乎没问题 (2认同)