单元测试:'[] |>应该等于List.empty'没有按预期工作

时间:2016-04-29 13:31:08

标签: f# pattern-matching xunit fsunit

我有以下代码,测试失败:

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'。预期:等于[]
  实际:是[]

2 个答案:

答案 0 :(得分:7)

这个答案只是为了澄清这背后的原因。事实证明,评论太长了。

这是一种类型不匹配的情况。打印出来时,[][]这两个值看起来相同,但实际上有不同的类型:“实际”值为string list,但“预期”值为{{1} }。

这是因为obj list是通用的,而List并不要求“expected”和“actual”具有相同的类型,从而防止类型推断被踢入。例如,此编译:

should equal

当然,它会在运行时失败,很好地告诉你这些值实际上并不相同。

但是如果你的一个值在返回类型中是通用的:

5 |> should equal "abc"

然后缺少类型推断意味着这个值最终将具有类型let a: int list = [] a |> should equal [] ,因此并不严格地说“等于”另一个具有不同类型的值。

答案 1 :(得分:6)

FsUnit中的

equal做了一些奇特的匹配be只是身份函数。 Here is the link source

如果使用以下条件,您的支票将没有问题:

|> should be Empty