Как правильно тестировать исключения с помощью FsUnit

Я пытаюсь выяснить, как правильно тестировать исключения с помощью FsUnit. Официальная документация гласит, что для проверки исключений я должен исправить что-то вроде этого:

(fun () -> failwith "BOOM!" |> ignore) |> should throw typeof<System.Exception>

Но, если я не отмечу свой метод испытаний [<ExpectedException>] приписывать это всегда будет неудачей. Звучит разумно, потому что если мы хотим проверить исключения, мы должны добавить такой атрибут в C# + NUnit.

Но, пока я добавил этот атрибут, не имеет значения, какое исключение я пытаюсь выдать, оно всегда будет обрабатываться.

Некоторые фрагменты: My LogicModule.fs

exception EmptyStringException of string

let getNumber str =
    if str = "" then raise (EmptyStringException("Can not extract number from empty string"))
    else int str

Мой LogicModuleTest.fs

[<Test>]
[<ExpectedException>]
let``check exception``()=
    (getNumber "") |> should throw typeof<LogicModule.EmptyStringException>

2 ответа

Решение

Ответ найден. Чтобы проверить это исключение, я должен обернуть свой вызов функции в следующем стиле:

(fun () -> getNumber "" |> ignore) |> should throw typeof<LogicModule.EmptyStringException>

так как под #fsunit используется ограничение Throws NUnit http://www.nunit.org/index.php?p=throwsConstraint&r=2.5 которое принимает делегат void, повышение возвращает 'a

Если вы хотите проверить, что определенный тип исключения вызывается каким-то кодом, вы можете добавить тип исключения к [<ExpectedException>] атрибут так:

[<Test; ExpectedException(typeof<LogicModule.EmptyStringException>)>]
let``check exception`` () : unit =
    (getNumber "")
    |> ignore

Дополнительная документация доступна на сайте NUnit: http://www.nunit.org/index.php?p=exception&r=2.6.2

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