Как утверждать, что ожидается исключение
Я на Mac под управлением F# с использованием.NET Core 2.0.
У меня есть функция, которая выглядит так:
let rec evaluate(x: string) =
match x with
// ... cases
| _ -> failwith "illogical"
Я хотел бы написать тест Expecto, который проверяет, что исключение выдается, как и ожидалось, что-то вроде:
// doesn't compile
testCase "non-logic" <| fun _ ->
Expect.throws (evaluate "Kirkspeak") "illogical"
Ошибка
Ожидается, что это выражение будет иметь тип 'unit -> unit', но здесь имеет тип 'char'
unit -> unit
заставляет меня это аналогично Assert.Fail
что не то, что я хочу.
Будучи новичком в F# и Expecto, у меня возникли проблемы с поиском рабочего примера утверждения, что исключение выдается, как и ожидалось. У кого-нибудь есть такой?
1 ответ
Expect.throws
имеет подпись (unit -> unit) -> string -> unit
поэтому функция, которую вы хотите проверить, должна быть (unit -> unit) или заключена в функцию, которая является (unit -> unit).
let rec evaluate (x: string) : char =
match x with
// ... cases
| _ -> failwith "illogical"
Ошибка компилятора говорит вам, что функция, которую вы передали в Expect.throws, еще не имеет правильной подписи.
[<Tests>]
let tests = testList "samples" [
test "non-logic" {
// (evaluate "Kirkspeak") is (string -> char)
// but expecto wants (unit -> unit)
Expect.throws (evaluate "Kirkspeak") "illogical"
}
]
[<EntryPoint>]
let main argv =
Tests.runTestsInAssembly defaultConfig argv
Один из способов заставить это работать - изменить
Expect.throws (evaluate "Kirkspeak") "illogical"
в
// you could instead do (fun () -> ...)
// but one use of _ as a parameter is for when you don't care about the argument
// the compiler will infer _ to be unit
Expect.throws (fun _ -> evaluate "Kirkspeak" |> ignore) "illogical"
Теперь ожидаемо счастлив!
Этот ответ был способ, которым я думал через это. Обычно полезно следить за типом подписей.
РЕДАКТИРОВАТЬ: я видел ваше сообщение об ошибке, говорящее This expression was expected to have type 'unit -> unit' but here has type 'char'
поэтому я обновил свой ответ, чтобы соответствовать ему.