我們有相當多的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中籤名的樣板模塊?
卡斯帕
Kapput(http://kaputt.x9c.fr/)具有'Mock'模塊。但我懷疑這是你想要的。是不是你想要更像一個間諜?在這種情況下,我認爲'ppx'或'camlp4'應該可以解決這個問題,儘管目前學習曲線很陡。 – nlucaroni
是的,的確,在這種簡單的情況下,它更像是間諜,你是對的。但最後我想要更多的「Mockito風格」,引用Java對應,可能性(也就是告訴函數在哪種情況下必須返回什麼參數,等等,這更多的是我認爲的模擬)。但是,事實上,camlp4的文檔實際上並不是很好(或者我還沒有找到好的文檔),所以如果有人能夠將我設置在這個簡單的間諜模塊的正確路徑上,那就太好了。 – Kasper
我最近把工作轉移到了他們使用Mockito的地方,所以我正在熟悉整個Mock和Spy的概念,所以很高興能夠重新確認我知道我在說什麼;)。在過去的幾個星期裏,我其實一直在思考這個問題,我一直在這個問題上討論,因爲根據camlp4和ppx可能會浪費時間。 – nlucaroni