F#:UnitTest案例失败

时间:2015-11-13 20:09:21

标签: testing f#

考虑我有一个像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

我使用FsUnitNunit,它们已加载并安装并正常运行。 然后我用

来测试它
[<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

我无法理解!!该功能正确失败,但测试不接受,所以为什么??????

1 个答案:

答案 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 - 这样测试框架就可以为你处理它。