首页 文章

OCaml模拟模块生成

提问于
浏览
5

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

卡斯帕

1 回答

  • 0

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

    https://github.com/KasperJanssens/mockaml

相关问题