2011-08-19 75 views
6

如何在OCaml中有一個假的數據庫連接的測試加倍?在OCaml中做一個測試加倍

假設您想要在數據庫之上測試一個小型API,並且其工作方式是通過爲API公開的每個函數提供Connection類型。

喜歡的東西:

let get_data connection = do_something_with_connection 

這將如何進行單元測試?

更大的意義在於OCaml通常會進行這種測試,因爲OCaml的強大類型系統已經確保您不會犯錯誤錯誤?

回答

3

您將創建一個對象,它具有與Connection相同的方法名稱,每個對象都具有相同的簽名(顯然具有存根功能)。然後你可以實例化這些對象中的一個,並通過子類型聲明它是一個Connection。然後它可以被傳入任何函數。

Here對子類型(應該指出,與Ocaml中的繼承不同)有幫助。

1

用一個仿函數構建你的模塊,該函數以連接模塊爲參數。然後,您可以在測試中將連接模塊剔除。

因此,舉例來說,你db.ml文件可能看起來有點像這樣:

(* The interface of Connection that we use *)                          
module type CONNECTION = sig 
    type t 
    val execute : string -> t -> string list 
end 

(* functor to build Db modules, given a Connection module *) 
module Make(Connection : CONNECTION) = struct 
    ... 
    let get_data connection = 
    do_something_with (Connection.execute "some query" connection) 
    ... 
end 

然後在你的test_db.ml你可以存根出連接模塊

let test_get_data() = 
    let module TestConnection = struct 
    type t = unit 
    let execute _ _ = ["data"] 
    end in 
    let module TestDb = Db.Make(TestConnection) in 

    assert (TestDb.get_data() = ["munged data"])