我们演示自始至终的整个过程,将使用与前一节PrintLongest 和PrintMultiWord相类似两个函数,但这一次,我们用F# 实现。从清单11.7 中可以看到,我们使用交互式控制台的方式略有不同。
清单11.7 使用xUnit.net 交互式测试代码(F# Interactive)
> #if INTERACTIVE | [1]
#r @"C:\ProgramFiles\xUnit\xunit.dll" | 引用 xUnit.net 库
#endif |
openXunit;;
> let getLongest(names:list<string>)= | [2]
names|> List.maxBy (fun name -> name.Length);; | 返回最长的地名
val getLongest : list<string> –> string
> let test = [ "Aaa"; "Bbbbb";"Cccc" ];;
val test : string list = ["Aaa"; "Bbbbb";"Cccc"]
> Assert.Equal("Bbbbb", getLongest(test));; <-- 用 xUnit.net 测试函数
val it : unit = ()
首先,我们需要将代码放到一个扩展名为.fs 的文件中,比如Program.fs(相应的.fsx 文件代表交互式脚本),是因为我们想把这个程序编译成.NET 程序集。此外,我们需要添加对xUnit.net 核心库的引用,在Visual Studio 只需使用添加引用对话框就可以了。我们还希望以交互方式运行代码,所以,要在F# Interactive 中加载这个库。我们通常会使用#r 指令,但此指令只允许在F# 脚本(FSX 文件)中使用。幸运的是,F# 支持条件编译,并定义了INTERACTIVE 符号,表示从命令行运行代码,这样,清单的开始部分就能保证[1],不管是否以交互方式运行都能正常工作。
下一步,我们实现从给定列表中找出最长地名的函数[2]。代码很简单,因为使用了F# 库中的高阶函数,这个函数选择给定函数返回大最值的元素。一旦我们有了这个函数,就在接下来的两行进行测试了。最有意义的是[3]行,我们使用了Assert.Equals 方法。这是从xUnit 命名空间导入的,验证实际值(作为第二个参数值)与期望值(第一个参数值)是否匹配。如果不是这种情况,即,结果返回unit,表示测试通过,则,方法将抛出异常。