2013-12-18 18 views
5

Abbiamo un discreto codice ocaml con molte dipendenze collegate tra i moduli. Ultimamente, abbiamo muovendo verso l'approccio funtore di disaccoppiare i moduli, quindi se abbiamo il modulo A che dipende il modulo B e C, andiamo in questo modo nella dichiarazione:Generazione modulo mock OCaml

module A: (B:B_Signature) (C:C_Signature) = struct ... end 

come non siamo in grado di iniettare un modulo B o C 'mocked up', che risponde a tali firme, nel modulo A per il test dell'unità, e può ancora creare il modulo di produzione con i moduli B e C reali in esso contenuti. Il problema è che in questo momento dobbiamo digitare a mano questi moduli simulati, che è un po 'un blocco, dato che di solito è un carico di piastre.

Quindi, sto cercando un modo per generare moduli "mock" da un modulo ocaml, invece di dattilografarli a mano. Quello che voglio dire con questo è se ho un modulo con alcune funzioni, avente la seguente firma

module type A = 
    sig 
    val f: string -> int -> string 
    val g: string -> string -> int 
    end 

Vorrei generare un'implementazione mock, per esempio come questo

module A_mock = 
struct 
let f _s _i = 
    "" 
let g _s1 _s2 = 
    0 
end 

Quindi, questo è un modulo che ha entrambe le funzioni, con la stessa firma, ma con implementazioni di f e g che ignorano i loro argomenti e restituiscono di default e stringa vuota per la funzione f e 0 per la funzione g.

Questi valori predefiniti, stringa vuota e zero, sono solo un esempio. So che vorrò avere questo più configurabile alla fine, voglio creare il mock e specificare i valori di ritorno per alcune funzioni, forse anche essere in grado di esaminare gli argomenti con cui sono state chiamate le funzioni derisposte e così via, ma per ora, per questo semplice caso, sto cercando una soluzione diversa dal digitare e implementare tutto questo a mano.

Non ho trovato alcun framework che faccia questo per OCaml.

Stavo cercando di scoprire come farlo con camlp4 e la generazione del codice, ma la documentazione sembra essere un po 'limitata e non ho davvero visto se sarebbe stato possibile.

Quindi, la mia domanda, qualcuno sa di un framework o se esiste un modo di generazione del codice per creare questo tipo di moduli standard da una firma in OCaml?

Kasper

+0

kapput (http://kaputt.x9c.fr/) dispone di un modulo 'Mock'. Ma dubito che sia quello che vuoi. Non è quello che vuoi più come una spia? Nel qual caso, penso che 'ppx' o' camlp4' dovrebbero risolvere quel bisogno anche se la curva di apprendimento è al momento ripida. – nlucaroni

+0

Sì, davvero, è più una spia in questo semplice caso, hai ragione. Ma alla fine voglio più "stile Mockito", per citare la controparte di java, le possibilità (quindi anche dire alla funzione quale argomento deve restituire nel qual caso, e così via e così via, che è più Mock che penso). Ma in effetti, la documentazione di camlp4 non è affatto buona (o non ho ancora trovato i buoni documenti), quindi se qualcuno potesse darmi il percorso corretto per quanto riguarda questo semplice modulo spia, sarebbe fantastico. – Kasper

+0

Recentemente ho cambiato lavoro in Mockito, quindi mi sto familiarizzando con i concetti di Mock and Spy quindi è bene essere riconfermati. So di cosa sto parlando;). In realtà ho riflettuto molto su questo particolare problema nelle scorse settimane e mi sono seduto su di esso poiché potrebbe essere una perdita di tempo sotto camlp4 e con ppx all'orizzonte. – nlucaroni

risposta

0

Va bene, ho creato l'inizio di una biblioteca Camp4 che creerebbe un modulo finto. C'è una pagina wiki sul github con un po 'di spiegazione, e un esempio di file di firma e due script registrati sul ramo principale, per ora. Spero di essere in grado di espandere questo e renderlo più robusto nel tempo, quando inizieremo ad usarlo di più probabilmente otterremo idee anche su di esso.

https://github.com/KasperJanssens/mockaml