使用xUnit在F#中测试异常时遇编译错误,求排查
F#中使用xUnit测试异常的编译错误解决方法
你的代码编译失败的核心问题有两个:
failwith "Error"会立即执行并抛出异常,而xUnit的Assert.Throws需要接收一个延迟执行的委托(也就是一段不会立刻运行的代码逻辑),这样它才能在捕获异常的上下文里执行这段代码。- 因为
failwith的返回类型是永远不会正常返回的'a,编译器无法自动匹配Assert.Throws的重载(它有接收Action/Func<Task>/Func<obj>的多个版本),所以报出FS0041错误。
修复后的代码
最简洁的修复方式是用F# lambda表达式把抛出异常的代码包装起来,让编译器自动匹配Action类型的重载:
module Tests open System open Xunit [<Fact>] let ``Simple Test`` () = Assert.Throws<Exception>(fun () -> failwith "Error")
另一种显式指定委托类型的写法(可选)
如果你需要明确指定委托类型,也可以用Action包装lambda:
[<Fact>] let ``Simple Test`` () = Assert.Throws<Exception>(Action(fun () -> failwith "Error"))
这样修改后,failwith "Error"只会在Assert.Throws内部被执行,xUnit就能正确捕获到异常,编译器也能确定要调用的重载方法,编译错误就会消失。
内容的提问来源于stack exchange,提问作者user1462309
相关产品推荐
相关产品推荐

