如何在OCaml中有一個假的數據庫連接的測試加倍?在OCaml中做一個測試加倍
假設您想要在數據庫之上測試一個小型API,並且其工作方式是通過爲API公開的每個函數提供Connection
類型。
喜歡的東西:
let get_data connection = do_something_with_connection
這將如何進行單元測試?
更大的意義在於OCaml通常會進行這種測試,因爲OCaml的強大類型系統已經確保您不會犯錯誤錯誤?
如何在OCaml中有一個假的數據庫連接的測試加倍?在OCaml中做一個測試加倍
假設您想要在數據庫之上測試一個小型API,並且其工作方式是通過爲API公開的每個函數提供Connection
類型。
喜歡的東西:
let get_data connection = do_something_with_connection
這將如何進行單元測試?
更大的意義在於OCaml通常會進行這種測試,因爲OCaml的強大類型系統已經確保您不會犯錯誤錯誤?
您將創建一個對象,它具有與Connection相同的方法名稱,每個對象都具有相同的簽名(顯然具有存根功能)。然後你可以實例化這些對象中的一個,並通過子類型聲明它是一個Connection。然後它可以被傳入任何函數。
Here對子類型(應該指出,與Ocaml中的繼承不同)有幫助。
用一個仿函數構建你的模塊,該函數以連接模塊爲參數。然後,您可以在測試中將連接模塊剔除。
因此,舉例來說,你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"])