OUnit:断言值是类型的实例

时间:2017-01-04 20:30:22

标签: unit-testing ocaml ounit

使用OCaml中的OUnit单元测试框架,我想测试一下,评估函数的结果是指定类型的实例。

在Python的PyTest中定义这样的测试将按如下方式进行:

def test_foo():
    assert isinstance(foo(2), int)

如何将此逻辑转换为OUnit?也就是说,如何指定类型成员资格的断言?

我知道,假设正在测试的函数使用正确的类型签名进行注释,则可能不需要进行此测试。

1 个答案:

答案 0 :(得分:1)

这是类型检查器的工作,它在编译期间自动生成(在静态时间)。类型检查器(即编译器)保证函数创建的所有值具有相同的类型,并且在编译时静态定义类型。您将无法编译创建不同类型值的函数,因为在编译期间会出现类型错误。这是所有静态类型语言的基本属性,例如,Java,C和C ++也具有相同的属性。

所以,可能,你使用的是令人困惑的术语。可能是这样的,你实际上试图测试的是,该值属于和类型的特定变体。例如,如果您将名为numbers的和类型定义为:

type t = 
  | Float of float
  | Int of int

并且您想测试该函数truncate,定义为

 let truncate = function
   | Float x -> Int (truncate x)
   | x -> x

始终返回Int变体,然后您可以执行以下操作:

  let is_float = function Float _ -> true | _ -> false
  let is_int = function Int _ -> true | _ -> false

  assert (is_int (truncate 3.14))