2016-04-29 43 views
1

我有一個試驗中,以下代碼失敗:單元測試:「[] |>應該等於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'被拋出。預計:等於[]
實際:是[]

+1

您是否試過使用''|應該是Empty''而不是? –

+0

這是有效的。謝謝Bartek。奇怪,平等不起作用。我會爲此調查fsunit。 –

+0

感興趣的:[FsUnit'應該等於'在'Some []']上失敗(http://stackoverflow.com/questions/23989847/fsunit-should-equal-fails-on-some) –

回答

6

在FsUnit equal做一些花哨的比賽是be僅僅是身份的功能。

|> should be Empty 
7

這個答案只是爲了澄清這背後的原因:如果你使用 Here is the link source

你的檢查將被罰款。事實證明,對於評論太長了。

這是一種類型不匹配的情況。兩個值[][]在打印輸出時看起來相同,但實際上有不同的類型:「實際」值爲string list,但「預期」值爲obj list。 。

這是因爲List是通用的,should equal不需要「預期」和「實際」有相同的類型,從而防止類型推斷在踢例如,這個編譯:

5 |> should equal "abc" 

它當然會在運行時失敗,很好地向您展示這些值實際上並不相同。

但是,如果你的價值觀之一是返回類型通用:

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

則缺乏類型推斷意味着這個值最終將不得不類型obj,因此不是嚴格意義上「平等」到其他值,它有不同的類型。

+1

可能是評論,但值得一個評論upvote,但是因爲它是一個答案,所以給評論一個贊成的唯一方法就是將它作爲回答。所以我的贊成是作爲評論upvote評論。 –

+0

感謝您的澄清。真棒。 –