单元测试:“[] |> 应该等于 List.empty”未按预期工作

Unit testing: '[] |> should equal List.empty' is not working as expected

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

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 : Exception of type 'FsUnit.Xunit+MatchException' was thrown. Expected: Equals []
Actual: was []

FsUnit 中的

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

如果您使用:

,您的支票就没问题了
|> should be Empty

这个回答只是为了澄清背后的原因。原来评论太长了

这是类型不匹配的情况。 [][]这两个值打印出来的时候看起来是一样的,但实际上有不同的类型:"actual"的值是string list,而"expected"的值是obj list.

发生这种情况是因为 List 是通用的,并且 should equal 不要求 "expected" 和 "actual" 具有相同的类型,从而防止类型推断开始.例如,这样编译:

5 |> should equal "abc"

当然,它会在运行时失败,很好地向您展示这些值实际上并不相等。

但是如果您的值之一在 return 中是通用的,请输入:

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

那么缺少类型推断意味着这个值最终将具有 obj 类型,因此严格来说 "equal" 不是另一个具有不同类型的值。