我开始使用 FsUnit 来测试 F# 代码。它使得以 F# 风格表达断言成为可能,例如:
[<Test>]
member this.``Portugal voted for 23 countries in 2001 Eurovision contest``() =
this.totalVotes
|> getYearVotesFromCountry "Portugal" 2001
|> Seq.length
|> should equal 23
注意我从 FsUnit 得到的“应该等于 23”。下面是 FsUnit 的定义:
让等于 x = new EqualConstraint(x)
使用浮点数并不是那么简单。我必须将 EqualConstraint 与 Within 方法一起使用。它自然适合 C#:
Assert.That(result).Is.EqualTo(1).Within(0.05);
当然,我希望能够用 F# 编写:
result |> should equal 1 within 0.05
但这不起作用。我最终定义了一个新函数:
let almostEqual x = (new EqualConstraint(x)).Within(0.01)
或者如果我想参数化精度,我可以将其指定为第二个参数:
let equalWithin x y = (new EqualConstraint(x)).Within(y)
但没有一个是漂亮的。我想以更自然的方式为 F# 定义“内部”函数,因此它可以与 equal 一起使用。F# 不支持方法重载,所以看起来我无法以这种方式定义它,因此“equal”可以单独使用,也可以与“within”一起使用。
有任何想法吗?