如何使用FsUnit正确测试异常

时间:2013-04-28 09:30:43

标签: f# fsunit

我试图找出如何使用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>

2 个答案:

答案 0 :(得分:16)

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

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

因为#fsunit下面使用了NUnit的Throws约束 http://www.nunit.org/index.php?p=throwsConstraint&r=2.5 ...取代void的代表,提出返回'a

答案 1 :(得分: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