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