2011-08-19 14 views
6

¿Cuán usual es tener una prueba doble en OCaml que falsifique una conexión de base de datos?Hacer una prueba doble en OCaml

Supongamos que quiere probar una pequeña API en la parte superior de una base de datos y la forma en que esto funciona es proporcionando un tipo Connection a cada función que exponga la API.

Algo así como:

let get_data connection = do_something_with_connection 

¿Cómo sería esto unidad probada?

En una nota más importante, ¿este tipo de prueba es habitual en OCaml, dado el hecho de que el potente sistema de tipo OCaml ya se asegura de que no cometa errores extraños?

Respuesta

3

Debería crear un objeto que tenga todos los mismos nombres de método que Connection, cada uno con las mismas firmas (y con la funcionalidad de stub, obviamente). Luego puede crear una instancia de uno de estos objetos y declararlo como una conexión a través de la subtipificación. Luego se puede pasar a cualquiera de las funciones.

Here es un fragmento útil sobre la subtipificación (que, debe tenerse en cuenta, no es lo mismo que la herencia en Ocaml).

1

Crea tu módulo con un funtor, que toma como argumento el módulo de conexión. Luego puede anular el módulo de conexión en sus pruebas.

Así, por ejemplo, su archivo db.ml podía mirar un poco como esto:

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

Luego, en su test_db.ml que sólo puede apagar el módulo de conexión

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