【问题标题】:how to catch a failwith with nUnit in F#?如何在 F# 中使用 nUnit 捕获失败?
【发布时间】:2020-07-19 18:32:15
【问题描述】:

假设我有这个代码:

let a () =
    failwith "I want to fail!"

然后我有一个 nUnit 测试:

Assert.Throws(fun () -> a() |> ignore)

测试将返回:

方法有非空返回值,但没有预期结果 异常没有堆栈跟踪

如果我有预期的失败情况,我如何测试用例?

有一些关于异常的问题/答案,但我没有找到失败案例的答案。

【问题讨论】:

    标签: f# nunit


    【解决方案1】:

    你可以这样做:

     Assert.Throws(typeof<System.Exception>, TestDelegate (a)) |> ignore
    

    顺便说一句,您可能想尝试FsUnit 一个基于 NUnit 的更友好的框架。代码如下所示:

       (fun () -> a() |> ignore)
       |> should throw typeof<System.Exception>
    

    【讨论】:

      【解决方案2】:

      Assert.Throws(fun () -> a() |> ignore)
      

      ignore 适用于您正在测试的功能,而不适用于 Assert.Throws。毫无疑问,您的意图是正确的。

      但是,Assert.Throws - 与大多数 nunit 断言不同 - 实际上返回一个值:抛出的异常。你也可以忽略它...

      Assert.Throws(fun () -> a() |> ignore) |> ignore
      

      但是,通常情况下,您不想忽略返回。返回它的全部意义在于您可能想要验证消息,查看堆栈跟踪等。如果我不想做任何事情,只是断言抛出了一些异常,我通常会使用

      Assert.That(fun () -> a() |> ignore, Throws.Exception);
      

      Assert.That 返回 C# void,即 unit

      [所有这些都是论坛代码,因为我没有在这台机器上安装 F#。 YMMV。]

      【讨论】:

        猜你喜欢
        • 2019-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多