2017-01-04 144 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))