fsunit.xunit在构造函数中测试异常

时间:2014-04-13 12:08:47

标签: f# xunit fsunit guard-clause

具有

type Category(name : string, categoryType : CategoryType) = 
        do
            if (name.Length = 0) then
                invalidArg "name" "name is empty"

我正在尝试使用FsUnit + xUnit测试此异常:

[<Fact>]
let ``name should not be empty``() =
    (fun () -> Category(String.Empty, CategoryType.Terminal)) |> should throw typeof<ArgumentException>

但是当它运行时,我会看到XUnit.MatchException。 我做错了什么?

  1. Test source code
  2. Category type source code

1 个答案:

答案 0 :(得分:4)

虽然我不是FsUnit专家,但我认为MatchException类型是预期的,因为FsUnit使用自定义匹配器,但匹配并不成功。

但是,所写的测试似乎不正确,因为

(fun () -> Category(String.Empty, CategoryType.Terminal)

是一个带有签名unit -> Category的函数,但您并不关心返回的Category

相反,您可以将其写为

[<Fact>]
let ``name should not be empty``() =
    (fun () -> Category(String.Empty, CategoryType.Terminal) |> ignore)
    |> should throw typeof<ArgumentException>

请注意添加的ignore关键字,该关键字忽略Category返回值。如果您删除了Guard子句,则此测试通过并失败。