2017-01-04 36 views
0

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

在Python中定义的PyTest这样的测试将做如下:

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

怎么能这样的逻辑被翻译成OUnit?也就是说,如何指定类型成员资格的断言?

我知道,假设被测函数是用适当的类型签名来注释的,这个测试可能是不必要的。

+2

如果该函数没有注释,它也是不必要的:-) OCaml是一种强类型语言,您不能计算错误的值类型。这是我们喜欢的原因之一。当然这是有道理的,根据*值*来考虑是否被允许。 –

+0

@JeffreyScofield。我应该早些提到这一点,但我无法测试特定的值,因为被测试的函数会随机生成一个类型的实例。我真的不知道如何单元测试这样的功能...... –

回答

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))