13

我试图弄清楚如何使用 FsUnit 正确测试异常。官方文档指出,要测试异常,我必须纠正这样的事情:

(fun () -> failwith "BOOM!" |> ignore) |> should throw typeof<System.Exception>

但是,如果我没有用[<ExpectedException>]属性标记我的测试方法,它总是会失败。听起来很合理,因为如果我们想测试异常,我们必须在 C# + NUnit 中添加这样的属性。

但是,只要我添加了这个属性,不管我试图抛出什么样的异常,它都会被处理。

一些片段:我的 LogicModule.fs

exception EmptyStringException of string

let getNumber str =
    if str = "" then raise (EmptyStringException("Can not extract number from empty string"))
    else int str

我的 LogicModuleTest.fs

[<Test>]
[<ExpectedException>]
let``check exception``()=
    (getNumber "") |> should throw typeof<LogicModule.EmptyStringException>
4

2 回答 2

18

已找到答案。为了测试抛出的异常,我应该将我的函数调用包装成下一个样式:

(fun () -> getNumber "" |> ignore) |> should throw typeof<LogicModule.EmptyStringException>

因为在 #fsunit 下面使用 NUnit 的 Throws 约束 http://www.nunit.org/index.php?p=throwsConstraint&r=2.5 ... 它接受一个 void 代表,raise 返回 'a

于 2013-04-28T12:45:17.203 回答
3

如果要测试某些代码是否引发了特定的异常类型,可以将异常类型添加到[<ExpectedException>]属性中,如下所示:

[<Test; ExpectedException(typeof<LogicModule.EmptyStringException>)>]
let``check exception`` () : unit =
    (getNumber "")
    |> ignore

NUnit 站点上提供了更多文档:http ://www.nunit.org/index.php?p=exception&r=2.6.2

于 2013-04-28T12:44:50.387 回答