2016-04-29 24 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

感谢您的澄清。真棒。 –