2011-08-19 13 views
6

Jak zwykle należy testować podwójnie w OCaml, który podszywałby połączenie z bazą danych?Wykonywanie testu podwójnego w OCaml

Powiedzmy, że chcesz przetestować małe API na bazie danych i sposób, w jaki to działa, podając typ Connection dla każdej funkcji udostępnianej przez interfejs API. przetestowany

let get_data connection = do_something_with_connection 

Jak będzie to jednostka:

Coś takiego?

Na większą uwagę zasługuje ten rodzaj testów zwykle w OCaml, biorąc pod uwagę, że potężny system OCaml już zapewnia, że ​​nie popełnisz dziwnych błędów?

Odpowiedz

3

Użytkownik utworzyłby obiekt, który ma wszystkie takie same nazwy metod jak Połączenia każdy z tymi samymi sygnaturami (i oczywiście z funkcjami pośredniczącymi). Następnie możesz utworzyć instancję jednego z tych obiektów i zadeklarować ją jako połączenie za pomocą podtypu. Następnie można go przekazać do dowolnej funkcji.

jest pomocnym podprocentowaniem (które, należy zauważyć, nie jest tym samym co dziedziczenie w Ocaml).

1

Zbuduj swój moduł za pomocą funktora, który bierze moduł połączenia jako argument. Następnie możesz wyodrębnić moduł Connection w swoich testach.

Tak więc, na przykład, plik db.ml może wyglądać trochę tak:

(* 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 

Następnie w test_db.ml można tylko skrótową z modułu przyłączeniowego

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