Как утверждать, ожидается исключение - PullRequest
0 голосов
/ 11 июня 2018

Я на 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 Ответ

0 голосов
/ 12 июня 2018

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"

to

// 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"

Теперь, вероятно, счастлив!

expecto says the test asserting an exception throws passes

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

РЕДАКТИРОВАТЬ: я увидел ваше сообщение об ошибке с текстом This expression was expected to have type 'unit -> unit' but here has type 'char', поэтому я обновил свой ответ, чтобы соответствовать ему.

...