2016-04-29 10 views
1

I持って失敗したテストでは、次のコード:ユニットテスト:「[] |> List.emptyに等しくなければならない」を期待通りに動作しない

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'がスローされました。予想:[]
実際等しい:いくつかの空想の試合はbe FsUnit中だった[]

+1

代わりに '' |> Empty''にする必要がありますか? –

+0

それは動作します。ありがとうBartek。奇妙なことは動作しません。私はそれについてfsunitを調べます。 –

+0

興味がある:[FsUnit 'は' Some [] 'で失敗するはずです'(http://stackoverflow.com/questions/23989847/fsunit-should-equal-fails-on-some) –

答えて

6

equalあったんは、単に恒等関数です。

|> should be Empty 
7

この答えは、この背後にある理由を明確にするだけです:あなたが使用している場合 Here is the link source

あなたのチェックは罰金になります。それはコメントのためには長すぎることが分かった。

これは型の不一致の状況です。 [][]の2つの値は同じに見えますが、実際の値はstring listですが、期待値はobj listです。

Listが一般的なので、これは起こり、そしてshould equalは、「予測される」および「実際は」これで蹴りからの型推論を防止し、同じ型を持っている必要はありません。例えば、これはコンパイルされます。

5 |> should equal "abc" 

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

しかし、あなたの値のいずれかが、戻り値の型では一般的なものであれば:

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

その後、型推論の欠如は、この値がタイプobjに終わるので、厳密に「等しい」話していないことを意味します異なる値を持つ他の値。

+1

コメントがありますが価値がありますコメントupvoteが、それは答えであるので、コメントをupvoteに与える唯一の方法は答えとしてupvoteすることです。だから私のupvoteはコメントupvoteとしてコメントのためです。 –

+0

説明をありがとう。驚くばかり。 –

関連する問題