考虑我有一个像newConvert
这样的函数。我很乐意接受newCovertor("IL")
的错误。要生成此错误:我使用了failwith "Invalid Input"
erorr是:
System.Exception: Invalid Input
> at FSI_0160.inputChecker(FSharpList`1 numberList) in C:\Users\Salman\Desktop\coursework6input\itt8060-master\coursework6input\BrokenRomanNumbers\Library1.fs:line 140
at FSI_0160.newCovertor(String romanNumber) in C:\Users\Salman\Desktop\coursework6input\itt8060-master\coursework6input\BrokenRomanNumbers\Library1.fs:line 147
at <StartupCode$FSI_0165>.$FSI_0165.main@() in C:\Users\Salman\Desktop\coursework6input\itt8060-master\coursework6input\BrokenRomanNumbers\newtest.fs:line 32
Stopped due to error
我使用FsUnit
和Nunit
,它们已加载并安装并正常运行。
然后我用
[<TestFixture>]
type ``Given a Roman number15 ``()=
[<Test>]
member this.
``Whether the right convert for this number must be exist``()=
newCovertor("IL") |> should equal System.Exception
我无法理解!!该功能正确失败,但测试不接受,所以为什么??????
答案 0 :(得分:0)
newCovertor
不生成System.Execption
- 抛出 - 所以你永远不会进入should equal ...
部分
要使用FsUnit捕获异常,您必须将其包装为操作:
(fun () -> newCovertor("IL") |> ignore) |> should throw typeof<System.Exception>
另见really good docs - 有很多方法可以实现这个目标
你的版本不能正常工作的原因是,当你在测试方法体内抛出异常时,NUnit会正确地将测试标记为失败。
如果你将其包裹在一个动作中,而should throw
可以选择在try ... match
块中执行此延迟动作以捕获预期的异常并将其过滤掉(或者这种情况如果没有,则抛出异常)
顺便说一句:就像在C#/ VB.net中一样,如果你愿意,你也可以在方法级别使用NUnit的ExpectedExceptionAttribute
- 这样测试框架就可以为你处理它。