在 FsUnit F# for XUnit 中断言异常

Asserting exception in FsUnit F# for XUnit

我正在尝试断言抛出了异常。这是重现问题的一段简化代码:

open FsUnit
open Xunit

let testException () =
    raise <| Exception()

[<Fact>]
let ``should assert throw correctly``() =
    (testException ())
        |> should throw typeof<System.Exception>

错误说抛出了 System.Exception 但测试应该通过,因为这就是我所断言的。有人可以帮助我哪里出错了。

您正在调用 testException 函数,然后将其结果作为参数传递给 should 函数。在运行时,testException 崩溃,因此永远不会 returns 结果,因此永远不会调用 should 函数。

如果你想让 should 函数捕获并正确报告异常,你需要将 testException 函数本身传递给它,而不是它的结果(因为首先没有结果).这样,should 函数将能够在 try..with 块中调用 testException,从而捕获异常。

testException |> should throw typeof<System.Exception>

这似乎可以解决问题:

[<Fact>]
let ``should assert throw correctly``() =
    (fun () -> Exception() |> raise |> ignore)
        |> should throw typeof<System.Exception>

不太确定为什么需要忽略。找不到任何解释。