3

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

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”类型的异常。预期:等于 []
实际:是 []

4

2 回答 2

8

equal在 FsUnit 中,一些花哨的匹配be只是身份功能。 这是链接源

如果您使用以下方式,您的支票就可以了:

|> should be Empty
于 2016-04-29T13:57:47.940 回答
8

这个答案只是为了澄清这背后的原因。结果发现评论太长了。

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

发生这种情况是因为List是通用的,并且should equal不需要“预期”和“实际”具有相同的类型,从而防止类型推断生效。例如,编译:

5 |> should equal "abc"

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

但是,如果您的值之一在返回类型中是通用的:

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

那么缺乏类型推断意味着该值最终将具有 type obj,因此严格来说与具有不同类型的另一个值“相等”。

于 2016-04-29T14:21:04.697 回答