3

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. 测试源代码
  2. 类别类型源代码
4

1 回答 1

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返回值。此测试通过,如果您删除保护条款则失败。

于 2014-04-13T12:36:43.053 回答