如何断言异常是预期的

时间:2018-06-11 20:11:18

标签: f# .net-core expecto

我正在使用.NET Core 2.0运行F#的Mac上。

我有一个看起来像这样的函数:

let rec evaluate(x: string) =
  match x with
  // ... cases
  | _ -> failwith "illogical"

我想编写一个Expecto测试,验证异常是按预期抛出的,类似于:

// doesn't compile
testCase "non-logic" <| fun _ ->
  Expect.throws (evaluate "Kirkspeak") "illogical" 

错误是

  

预计此表达式具有类型       '单位 - &gt; unit'但这里有'char'类型

unit -> unit让我觉得这类似于Assert.Fail,这不是我想要的。

对于F#和Expecto来说有些新手,我无法找到断言按预期抛出异常的工作示例。有人有吗?

1 个答案:

答案 0 :(得分:4)

Expect.throws具有签名(unit -> unit) -> string -> 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"

现在期待很高兴!

expecto says the test asserting an exception throws passes

这个答案是我通过它思考的方式。遵循类型签名通常很有帮助。

编辑:我看到您的错误消息This expression was expected to have type 'unit -> unit' but here has type 'char',所以我更新了我的答案以匹配它。