3

失敗したテストを含む次のコードがあります。

open Xunit
open FsUnit.Xunit

let rec openOrSenior xs = 
    match xs with
    | head :: tail when fst head >= 55 && snd head >= 7 -> "Senior" :: openOrSenior tail
    | head :: tail -> "Open" :: openOrSenior tail
    | [] -> []

[<Fact>]
let ``empty input gives empty result``() =
    openOrSenior [] |> should equal List.empty

テストは次の一致エラーで失敗します

FsUnit.Xunit+MatchException : タイプ 'FsUnit.Xunit+MatchException' の例外がスローされました。予想: [] に等しい
実際: [] だった

4

2 に答える 2

8

equalFsUnit では、いくつかのファンシー マッチが実行されますが、これbeは単なる ID 関数です。 リンク元はこちら

以下を使用する場合、小切手は問題ありません。

|> should be Empty
于 2016-04-29T13:57:47.940 に答える
8

この回答は、この背後にある理由を明確にするためのものです。コメントするには長すぎることが判明しました。

これは型の不一致の状況です。2 つの値[][]は、出力すると同じように見えますが、実際には型が異なります。「実際の」値は ですstring listが、「期待される」値はobj listです。

これListはジェネリックであるため発生should equalし、"expected" と "actual" が同じ型である必要がないため、型推論が開始されません。たとえば、次のようにコンパイルします。

5 |> should equal "abc"

もちろん、実行時に失敗し、値が実際には等しくないことがうまく表示されます。

ただし、値のいずれかが戻り値の型でジェネリックである場合:

let a: int list = []
a |> should equal []

型推論の欠如は、この値が最終的に type を持つことを意味するobjため、厳密に言えば、異なる型を持つ他の値と「等しい」とは言えません。

于 2016-04-29T14:21:04.697 に答える