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 がそれを定義する方法は次のとおりです。
let equal x = new EqualConstraint(x)
浮動小数点数では、それほど単純ではありません。Within メソッドで EqualConstraint を使用する必要があります。自然に 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)
または、精度をパラメータ化したい場合は、2 番目の引数として指定できます。
let equalWithin x y = (new EqualConstraint(x)).Within(y)
しかし、それらのどれもきれいではありません。「with」関数を F# のより自然な方法で定義して、equal と一緒に使用できるようにしたいと考えています。F# はメソッドのオーバーロードをサポートしていないので、"equal" を単独で、または "within" と組み合わせて使用できるように定義することはできないようです。
何か案は?