OUnit:断言值是类型的实例
OUnit: assert value is instance of type
使用OCaml中的OUnit单元测试框架,我想测试一个函数的求值结果是指定类型的实例。
在 Python 的 PyTest 中定义这样的测试将按如下方式完成:
def test_foo():
assert isinstance(foo(2), int)
如何将此逻辑转换为 OUnit?也就是说,类型成员资格的断言是如何指定的?
我知道,假设被测函数使用正确的类型签名进行注释,则此测试可能是不必要的。
这是类型检查器的工作,它是在编译期间自动生成的(静态时)。类型检查器(即编译器)保证函数创建的所有值都具有相同的类型,并且类型是在编译时静态定义的。您将无法编译创建不同类型值的函数,因为您将在编译期间遇到类型错误。这是所有静态类型语言中必不可少的属性,例如Java,C和C++也有相同的属性。
所以,您使用的可能是令人困惑的术语。可能是这种情况,您实际要测试的是该值属于总和类型的特定变体。例如,如果您有一个名为 numbers
的求和类型定义为:
type t =
| Float of float
| Int of int
并且您想测试该函数 truncate
,定义为
let truncate = function
| Float x -> Int (truncate x)
| x -> x
始终returns Int
变体,那么您可以按如下方式执行此操作:
let is_float = function Float _ -> true | _ -> false
let is_int = function Int _ -> true | _ -> false
assert (is_int (truncate 3.14))
使用OCaml中的OUnit单元测试框架,我想测试一个函数的求值结果是指定类型的实例。
在 Python 的 PyTest 中定义这样的测试将按如下方式完成:
def test_foo():
assert isinstance(foo(2), int)
如何将此逻辑转换为 OUnit?也就是说,类型成员资格的断言是如何指定的?
我知道,假设被测函数使用正确的类型签名进行注释,则此测试可能是不必要的。
这是类型检查器的工作,它是在编译期间自动生成的(静态时)。类型检查器(即编译器)保证函数创建的所有值都具有相同的类型,并且类型是在编译时静态定义的。您将无法编译创建不同类型值的函数,因为您将在编译期间遇到类型错误。这是所有静态类型语言中必不可少的属性,例如Java,C和C++也有相同的属性。
所以,您使用的可能是令人困惑的术语。可能是这种情况,您实际要测试的是该值属于总和类型的特定变体。例如,如果您有一个名为 numbers
的求和类型定义为:
type t =
| Float of float
| Int of int
并且您想测试该函数 truncate
,定义为
let truncate = function
| Float x -> Int (truncate x)
| x -> x
始终returns Int
变体,那么您可以按如下方式执行此操作:
let is_float = function Float _ -> true | _ -> false
let is_int = function Int _ -> true | _ -> false
assert (is_int (truncate 3.14))