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
我做错了什么?
  • Test source code
  • Category type source code
  • 最佳答案

    虽然我不是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返回值。该测试通过,但如果您删除“保护条款”,则失败。

    关于f# - 构造函数中的fsunit.xunit测试异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23042547/

    10-10 08:58