Den*_*and 3 testing f# assert exception
我只是在学习F#,所以我正在尝试一些事情(我知道可以使用XUnit或其他东西)
我有以下断言方法,并且想法是它应该采用预期的异常和它期望抛出此异常的函数,然后执行函数并在with测试内部如果抛出的异常与预期的异常相同.
let assertException (testName : string) (expected : 'a when 'a :> Exception) functionToBeTested =
try
functionToBeTested
(false)
with
| :? Exception as someException when someException :? expected ->
printTestResultInMiddle (sprintf "Test: %s PASSED: Raised expected exception %A" testName expected) true
(true)
| _ ->
printTestResultInMiddle (sprintf "Test: %s FAILED: expected exception %A" testName expected) false
(false)
Run Code Online (Sandbox Code Playgroud)
它给了我在Unexpected symbol '(' in pattern matching. Expected '->' or other token.
尝试调用print方法的行中的错误.我不应该把它try ... with
当作一个对待
match ... with
Run Code Online (Sandbox Code Playgroud)
??
还有一个问题,我可以轻松地做到这一点吗?
首先,
你试图使用类型的查询操作:?
与价值expected
型的'a
.此运算符不能与值一起使用,仅适用于以下类型:
let x = box 5
let a = x :? int // true
let b = x :? string // false
let y = 10
let c = x :? y // error: type 'y' is not defined
Run Code Online (Sandbox Code Playgroud)
在您的示例中(使用异常),这将如下所示:
someException :? InvalidOperationException
Run Code Online (Sandbox Code Playgroud)
或者,如果要与类型参数进行比较:
someException :? 'a
Run Code Online (Sandbox Code Playgroud)
其次,
为什么你someException
只想比较它的类型,你为什么要给出名字?这正是该with | :?
条款开始时所做的事情:
try
...
with
| :? 'a ->
...
Run Code Online (Sandbox Code Playgroud)
然后,您实际上并不需要该值expected
,因为您要探测的只是类型.所以你可以声明泛型参数并取消常规参数:
let assertException<'a> (testName : string) functionToBeTested =
...
Run Code Online (Sandbox Code Playgroud)
最后,
你functionToBeTested
实际上并不是一个函数,因为你没有调用它.如果要验证它在执行期间是否抛出特定异常,则需要实际进行调用:
functionToBeTested()
Run Code Online (Sandbox Code Playgroud)
把它们放在一起:
let assertException<'a when :> exn> (testName : string) functionToBeTested =
try
functionToBeTested()
(false)
with
| :? 'a ->
printTestResultInMiddle (sprintf "Test: %s PASSED: Raised expected exception %A" testName typeof<'a>.Name) true
(true)
| _ ->
printTestResultInMiddle (sprintf "Test: %s FAILED: expected exception %A" testName typeof<'a>.Name) false
(false)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
70 次 |
最近记录: |