OUnit:声明值是类型的实例
问题描述:
在OCaml中使用OUnit单元测试框架,我想测试函数的评估结果是指定类型的一个实例。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
总是返回Int
变种,那么你可以做这如下所示:
let is_float = function Float _ -> true | _ -> false
let is_int = function Int _ -> true | _ -> false
assert (is_int (truncate 3.14))
如果该函数没有注释,它也是不必要的:-) OCaml是一种强类型语言,您不能计算错误的值类型。这是我们喜欢的原因之一。当然这是有道理的,根据*值*来考虑是否被允许。 –
@JeffreyScofield。我应该早些提到这一点,但我无法测试特定的值,因为被测试的函数会随机生成一个类型的实例。我真的不知道如何单元测试这样的功能...... –