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

时间:2012-07-02 14:01:22

标签: f# tdd xunit

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

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

#r "System.Xml"
#r "System.Xml.Linq"

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

有没有基于xUnit worflow中的脚本集成测试? 建议用什么组织编写脚本文件测试?

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

2 个答案:

答案 0 :(得分: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()

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

module Main
open Demo    
test() |> printfn "%A"

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

fsc.exe --target:library test.fsx test.fs

我认为如果你添加一个库项目,然后在{{1文件:

fsproj

请注意,当您使用&#34;添加项目&#34;添加<Compile Include="..\Eslewhere\In\Your\Project\Tree\File.fsx"> <Link>File.fsx</Link> </Compile> 文件时,会将其标记为&#34;包括&#34;但不是&#34;编译&#34;,所以它不会被编译为项目的一部分。上面应该在项目中包含它,它应该告诉编译器也将它包含在编译的程序集中。

警告:表示,我认为使用标准单元测试测试刚编译的fsx文件可能会更好。如果你想测试dll个文件,我会在最后添加几行作为测试并手动运行(select,fsx + Alt)。原因是Enter文件应该经常更改,因此进行过于严格的测试可能会限制您的灵活性。另一方面,一旦代码变得更加可靠,将其移动到fsx文件是有意义的。

答案 1 :(得分:0)

我认为最简单的解决方案是获取您想要测试的代码并将其放在单独的*.fs文件中。在*.fsx脚本中,您可以使用#load指令从*.fs文件加载代码(#load与C / C ++中的#include类似)。

对于单元测试,您可以创建一个简单的F#库项目,其中包含使用*.fs的{​​{1}}文件(如Tomas的答案),然后针对编译的DLL运行单元测试。