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/

相关文章:

java - 使用 Mockito 和 JUnit 进行测试时的奇怪行为

c# - 单元测试 Entity Framework 不会使用 shims 和 fakes 返回 100% 的覆盖率?

javascript - 使 karma 测试看起来更好(或更像rspec)

CMake 通配生成的文件

OOP-如何在ReasonML中创建一个类

java - Android Instrumented Tests涵盖范围不包括苍蝇

c# - 在面向使用者代码的 NuGet 库中使用源生成器

ocaml - 在 ocaml 中运行可执行(windows)文件

tree - OCaml 未绑定(bind)值

java - 如何从数据库生成对象@Entities?