我有一些脚本文件的功能,setup.fsx我想测试那些.xUnit和类似需要测试的函数是程序集的一部分.
所以我想将我的脚本从setup.fsx重命名为setup.fs扩展名,然后从另一个脚本文件加载它.但后来我的脚本依赖于
#r "System.Xml"
#r "System.Xml.Linq"
Run Code Online (Sandbox Code Playgroud)
然后我必须在调用脚本中指定(远离依赖实际出现的位置)
无论如何都要在xUnit worflow中集成基于脚本的测试吗?建议用什么组织编写脚本文件的测试?
(可能我们需要一个visual studio扩展,用于脚本中的测试而不是汇编...)
即使您只是将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文件中就有意义了。