gpt4 book ai didi

unit-testing - OCaml 模拟模块生成

转载 作者:行者123 更新时间:2023-12-03 17:51:26 25 4
gpt4 key购买 nike

我们有相当多的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com