OCaml模拟模块生成

5

我们有相当多的ocaml代码,模块之间存在许多紧密耦合的依赖关系。最近,我们开始采用functor方法来解耦这些模块。因此,如果模块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和0供函数g使用。
这些默认值,空字符串和零,只是一个示例。我知道最终我会希望这更加可配置,我想创建模拟并指定某些函数的返回值,甚至能够检查调用模拟函数时使用的参数等等,但目前为止,对于这种简单情况,我正在寻找一种不必手动输入和实现所有内容的解决方案。
我没有找到任何可以在OCaml中完成这个任务的框架。
我试图通过camlp4和代码生成来弄清楚如何做到这一点,但文档好像有点有限,我真的没有看到是否可能。
所以我的问题是,是否有人知道一个框架或者是否有一种代码生成的方法可以从OCaml签名中创建这种样板模块?
Kasper

1
Kapput(http://kaputt.x9c.fr/)有一个`Mock`模块。但我怀疑这不是你想要的。你想要的更像是一个Spy吧?如果是这样,我认为`ppx`或`camlp4`可以解决这个需求,尽管目前学习曲线陡峭。 - nlucaroni
没错,就这个简单的情况而言,它更像是一个间谍,你说得对。但最终我希望能有更多“Mockito风格”的功能(引用Java的对应方案),例如告诉函数在哪种情况下返回什么参数等等,这更像是Mock I think。但确实,camlp4的文档真的非常不好(或者我还没有找到正确的文档)。因此,如果有人能指导我关于这个简单的spy模块或其他方面的正确路径,那就太好了。 - Kasper
我最近换了一份工作,他们使用Mockito,所以我正在熟悉整个Mock和Spy的概念,这让我很高兴能够重新确认自己知道自己在说什么。;) 实际上,我在过去几周里一直在思考这个特定的问题,但我一直没有着手解决它,因为在camlp4下可能是浪费时间的,而ppx即将到来。 - nlucaroni
2
我学习Camlp4最喜欢的资源是http://ambassadortothecomputers.blogspot.com/p/reading-camlp4.html。 - lukstafi
好的,我决定采用Camlp4的方法为ocaml创建一种基于mockito的模拟框架。如果我成功做出了什么东西,我会将其发布到github并在这里分享链接,以防有人感兴趣。目前,我正在与camlp4苦战,这是一场艰巨的战斗。 - Kasper
1个回答

0

好的,我创建了一个camp4库的起始点,可以创建一个模拟模块。在github上有一个维基页面,有一些解释,还有一个示例签名文件和两个脚本现在也被检入到主分支中。希望能够在时间允许的情况下扩展这个库,当我们开始更多地使用它时,我们可能会得到关于它的更多想法。

https://github.com/KasperJanssens/mockaml


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接