试图组合一些断言函数,我无法尝试工作

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)

??

还有一个问题,我可以轻松地做到这一点吗?

Fyo*_*kin 5

首先,
你试图使用类型的查询操作:?与价值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)