顯然你需要在這裏把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),這非常棒! –