Как утверждать об асинхронном исключении в Expecto без RunSynchronously?
Я начал использовать платформу F# Expecto и не могу найти правильный способ утверждения исключения в выражениях асинхронных вычислений.
Мой код закончился:
Expect.throws (fun () ->
async {
// Some async code expected to fail...
do! Async.Sleep 1
failwith "error"
}
|> Async.RunSynchronously
|> ignore) "valuable message"
Есть лучший способ сделать это? (без запуска синхронно и игнорирования).
Спасибо
1 ответ
Комбинатор для этого, похоже, еще не встроен в Expecto, но вы можете расширить его собственным:
module Expect =
let throwsAsync (code: unit -> Async<unit>) (message: string) = async {
let! thrown = async {
// Using a try-catch and a lambda is better than Async.Catch, because there are otherwise some circumstances where exceptions don't get caught
try
//
do! code ()
return false
with _ ->
return true
}
if not thrown then
failtestf "%s. Expected f to throw." message
}
Затем используйте его так:
let f () = async {
// Some async code expected to fail...
do! Async.Sleep 1
failwith "error"
}
testCaseAsync "Some test" (async {
do! Expect.throwsAsync (fun () -> f ()) "Should throw"
})