OCaml模拟模块生成

时间:2013-12-18 09:55:11

标签: unit-testing code-generation ocaml

我们有一些ocaml代码,模块之间有很多硬耦合依赖关系。最近,我们一直在转向仿函数方法来解耦这些模块,所以如果我们有模块A依赖于模块B和C,我们在声明中这样做:

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

像这样,我们可以在模块A中注入“模拟”B或C模块,回答这些签名,进行单元测试,并且仍然可以创建包含真实B和C模块的生产模块。问题是,现在我们必须手动输入这些模拟的模块,这有点像块,因为它通常是模板的载荷。

所以,我正在寻找一种从ocaml模块生成'mock'模块的方法,而不是手工输入它们。我的意思是,如果我有一个具有一些功能的模块,具有以下签名

   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中的签名创建这种样板模块?

卡斯帕

1 个答案:

答案 0 :(得分:0)

好的,我创建了一个camp4库的开头,它将创建一个模拟模块。 github上有一个wiki页面,有一些解释,现在还在主分支上检查了一个示例签名文件和两个脚本。希望能够扩展它并使其更加稳健,当我们开始使用它时,我们也可能会对它有所了解。

https://github.com/KasperJanssens/mockaml