我有以下代码,测试失败:
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'。预期:等于[]
实际:是[]
答案 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)