2013-12-18 158 views
5

我們有相當多的ocaml代碼,模塊之間有很多硬耦合的依賴關係。最近,我們一直移動到仿函數的方法來分離這些模塊,所以如果我們依賴於模塊B和C模塊A,我們走這樣的聲明:OCaml模擬模塊生成

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

這樣我們就可以注入一個'模擬'B或C模塊,回答這些簽名,在模塊A中進行單元測試,並且仍然可以創建帶有真實B和C模塊的生產模塊。現在的問題是,我們現在必須手動輸入這些模擬模塊,這有點阻礙了,因爲它通常是裝載樣板。

所以,我正在尋找一種方法來從ocaml模塊生成'模擬'模塊,而不是手工輸入它們。我的意思跟那就是如果我有幾個功能模塊,具有以下特徵

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

我想產生一個模擬實現,例如像這樣

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

所以,這是一個具有相同簽名的函數的模塊,但具有f和g的實現,忽略它們的參數並默認返回,函數f的空字符串和函數g的0。

那些默認值,空字符串和零,只是一個例子。我知道我最終會希望這個更具可配置性,我想創建模擬並指定某些函數的返回值,甚至可以檢查調用函數被調用的參數等等,但現在,對於這個簡單的例子,我正在尋找一種解決方案,而不是手工輸入和實現這一點。

我沒有找到任何框架爲OCaml做到這一點。

我想知道如何通過camlp4和代碼生成,但文檔似乎是有限的,我真的不知道它是否可能。

所以,我的問題,是否有人知道一個框架,或者是否有代碼生成方式來創建這種從OCaml中籤名的樣板模塊?

卡斯帕

+0

Kapput(http://kaputt.x9c.fr/)具有'Mock'模塊。但我懷疑這是你想要的。是不是你想要更像一個間諜?在這種情況下,我認爲'ppx'或'camlp4'應該可以解決這個問題,儘管目前學習曲線很陡。 – nlucaroni

+0

是的,的確,在這種簡單的情況下,它更像是間諜,你是對的。但最後我想要更多的「Mockito風格」,引用Java對應,可能性(也就是告訴函數在哪種情況下必須返回什麼參數,等等,這更多的是我認爲的模擬)。但是,事實上,camlp4的文檔實際上並不是很好(或者我還沒有找到好的文檔),所以如果有人能夠將我設置在這個簡單的間諜模塊的正確路徑上,那就太好了。 – Kasper

+0

我最近把工作轉移到了他們使用Mockito的地方,所以我正在熟悉整個Mock和Spy的概念,所以很高興能夠重新確認我知道我在說什麼;)。在過去的幾個星期裏,我其實一直在思考這個問題,我一直在這個問題上討論,因爲根據camlp4和ppx可能會浪費時間。 – nlucaroni

回答

0

好吧,我創建了一個的Camp4庫,將創建一個模擬模塊的開始。在github上有一個wiki頁面,有一些解釋,還有一個示例簽名文件和兩個腳本,現在也在master分支中籤入。希望能夠擴展這一點並使其更加強大,當我們開始更多地使用它時,我們也可能會得到關於它的想法。

https://github.com/KasperJanssens/mockaml