我们有一些ocaml代码,模块之间有很多硬耦合依赖.最近,我们一直在转向仿函数方法来解耦这些模块,所以如果我们有模块A依赖于模块B和C,我们在声明中这样做:
module A: (B:B_Signature) (C:C_Signature) = struct ... end
像这样,我们可以在模块A中注入"模拟"B或C模块,回答这些签名,进行单元测试,并且仍然可以创建包含真实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中的签名创建这种样板模块?
卡斯帕