单元测试:“[] |> 应该等于 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" 不是另一个具有不同类型的值。
我有以下测试失败的代码:
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 []
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" 不是另一个具有不同类型的值。