0

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

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

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

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

我知道,假设被测函数用正确的类型签名进行了注释,那么这个测试可能是不必要的。

4

1 回答 1

2

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

因此,您可能正在使用令人困惑的术语。可能是这种情况,您实际尝试测试的是该值属于 sum 类型的特定变体。例如,如果您有一个称为 sum 类型的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))
于 2017-01-06T19:34:44.310 回答