【问题标题】:Unit testing: '[] |> should equal List.empty' is not working as expected单元测试:'[] |> 应该等于 List.empty' 没有按预期工作
【发布时间】:2016-04-29 13:31:08
【问题描述】:

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

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

【问题讨论】:

  • 你试过用|&gt; should be Empty代替吗?
  • 那行得通。谢谢巴特克。奇怪的是 equal 不起作用。我会为此调查 fsunit。

标签: f# pattern-matching xunit fsunit


【解决方案1】:

FsUnit 中的equal 做了一些花哨的匹配,be 只是标识函数。 Here is the link source

如果您使用,您的支票会很好:

|> should be Empty

【讨论】:

    【解决方案2】:

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

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

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

    5 |> should equal "abc"
    

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

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

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

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

    【讨论】:

    • 可能是评论,但值得评论投票,但由于这是一个答案,因此给予评论投票的唯一方法是将其作为答案投票。所以我的upvote是将评论作为评论upvote。
    • 感谢您的澄清。太棒了。
    猜你喜欢
    • 2013-07-05
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多