5

我有一个脚本文件 setup.fsx 的一些功能,我想测试它们。xUnit 等需要将要测试的函数作为程序集的一部分。

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

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

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

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

(也许我们需要一个 Visual Studio 扩展来在脚本中而不是在汇编中进行测试......)

4

2 回答 2

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

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

<Compile Include="..\Eslewhere\In\Your\Project\Tree\File.fsx">
  <Link>File.fsx</Link>
</Compile>

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

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

于 2012-07-02T14:20:40.573 回答
0

我认为最简单的解决方案是将要测试的代码放在单独的*.fs文件中。在您的*.fsx脚本中,您可以使用该#load指令从*.fs文件中加载代码(#load就像#include在 C/C++ 中一样)。

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

于 2012-07-03T10:51:32.150 回答