Утверждение исключения в FsUnit F# для XUnit

Я пытаюсь утверждать, что было сгенерировано исключение. Вот сокращенный фрагмент кода, который воспроизводит проблему:

open FsUnit
open Xunit

let testException () =
    raise <| Exception()

[<Fact>]
let ``should assert throw correctly``() =
    (testException ())
        |> should throw typeof<System.Exception>

Ошибка говорит о том, что было сгенерировано исключение System.Exception, но тест должен пройти, поскольку это то, что я утверждаю. Может кто-нибудь, пожалуйста, помогите, где я иду не так.

2 ответа

Решение

Вы звоните testException функции, а затем передать свой результат в качестве аргумента should функция. Во время выполнения, testException вылетает, и поэтому никогда не возвращает результат, и поэтому should функция никогда не вызывается.

Если вы хотите should Функция, чтобы поймать и правильно сообщить об исключении, вам нужно передать его testException сама функция, а не ее результат (ибо в первую очередь нет результата). Таким образом, should функция сможет вызывать testException в пределах try..with заблокировать и, таким образом, поймать исключение.

testException |> should throw typeof<System.Exception>

Кажется, это помогает:

      [<Fact>]
let ``should assert throw correctly``() =
    (fun () -> Exception() |> raise |> ignore)
        |> should throw typeof<System.Exception>

Не совсем уверен, почему требуется игнорирование tbh. Не нашел ничего, чтобы это объяснить.

Другие вопросы по тегам