unit-testing - OCaml 模拟模块生成

标签 unit-testing code-generation ocaml

我们有相当多的 ocaml 代码,模块之间有很多硬耦合依赖项。最近,我们一直在使用仿函数方法来解耦这些模块,所以如果我们有依赖于模块 B 和 C 的模块 A,我们在声明中会这样:

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

像这样,我们可以在模块 A 中注入(inject)一个“模拟”的 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 中的签名创建这种样板模块?

卡斯帕

最佳答案

好的,我创建了一个可以创建模拟模块的 camp4 库的开始。 github 上有一个带有一些解释的 wiki 页面,以及一个示例签名文件和两个脚本,目前也在 master 分支上 checkin 。希望能够扩展它并及时使其更加强大,当我们开始更多地使用它时,我们也可能会得到关于它的想法。

https://github.com/KasperJanssens/mockaml

关于unit-testing - OCaml 模拟模块生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20654800/

相关文章:

unit-testing - 我必须为 SpringMVC3.2 单元测试导入什么?

optimization - LLVM 插入值优化不好?

ocaml - 构建字符串的有效方法

ocaml - OCaml 如何通过文本表示对多态变体进行排序?

java - Java/Mockito 中的模拟链式方法调用

c# - 外部化 appSettings 配置部分(使用 configSource)和 mstest 的冲突

javascript - 找不到变量 : Promise in Phantomjs

java - 以编程方式编辑/修改 .java 文件? (不是 .class 文件)

java - 使用 Java 注释在方法中生成一些代码

ocaml - 是否可以在 Ocaml REPL 中跟踪辅助功能