显然你需要在这里把when
表达式括起来。而且您需要检查类型的expected
,这是'a
。以下应编译(它的工作对我来说,当我换成你printTestResultInMiddle
电话与printfn
电话):
let assertException (testName : string) (expected : 'a when 'a :> Exception) functionToBeTested =
try
functionToBeTested
(false)
with
| :? Exception as someException when (someException :? 'a) ->
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)
然而,这给在:? Exception as someException
表达一个警告:
警告FS0067:此型式试验或downcast将始终保持
这是因为根据try ... with
documentation,裸露标识符相当于:? System.Exception as <identifier>
。所以,你可以简化你的函数到:
let assertException (testName : string) (expected : 'a when 'a :> Exception) functionToBeTested =
try
functionToBeTested
(false)
with
| someException when (someException :? 'a) ->
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)
但实际上,它做这种方式的更简单:
let assertException (testName : string) (expected : 'a when 'a :> Exception) functionToBeTested =
try
functionToBeTested
(false)
with
| :? 'a ->
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)
这也编译时,我尝试在F#互动,虽然我的天堂”实际上测试了它。我注意到你在try
表达functionToBeTested
也许应该是一个函数调用(即functionToBeTested()
。而且你也不需要围绕(true)
和(false)
表达这些括号无论是。
所以,你的代码的一个更迭代,如简单,我可以把它在不改变其语义(请注意,我有改变了它的语义只是functionToBeTested()
一点点)将是:
let assertException (testName : string) (expected : 'a when 'a :> Exception) functionToBeTested =
try
functionToBeTested()
false
with
| :? 'a ->
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
*“我能做到这一点轻松了许多或?“*是的,您可以使用[Unquote](http://www.swensensoftware.com/unquote),这非常棒! –