首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >沙丘+ qtest在多文件项目中的应用

沙丘+ qtest在多文件项目中的应用
EN

Stack Overflow用户
提问于 2021-10-10 11:47:25
回答 2查看 140关注 0票数 1

让我首先说我是OCaml的完全初学者,所以如果我似乎做了一些奇怪的选择,我很可能没有意识到它们是一个选择。

我正在尝试让单元测试在我的项目中工作。经过一番搜索后,我决定选择qtest.lib

我将我的项目设置如下:

代码语言:javascript
复制
$ mkdir mylib
$ cd mylib
$ dune init lib mylib

dune文件中,我写了:

代码语言:javascript
复制
(library
 (name mylib)
 (inline_tests (backend qtest.lib)))

mylib.ml中,我放置了以下代码:

代码语言:javascript
复制
let foo x = x + 2

(*$T foo
  foo 2 = 4
*)

此时,一切都如预期的那样工作。

代码语言:javascript
复制
$ dune runtest
Info: Creating file dune-project with this contents:
| (lang dune 2.9)
inline_test_runner_mylib alias runtest
random seed: 425752161
 [1 / 1] >foo>mylib.ml:4 *
 [1 / 1] >foo>;32;1mSUCCESS

如果我尝试在项目中引入另一个文件,问题就开始了。我创建了具有以下内容的helper.ml

代码语言:javascript
复制
let bar x = 3 * x

(*$T bar
  bar 3 = 9
*)

现在,dune runtest错误与

代码语言:javascript
复制
$ dune runtest
File "mylib.ml", line 11, characters 5-11:
Error: Unbound module Helper

在我试图复制它的其他一些尝试中,提到的文件是_build/default/.mylib.inline-tests/inline_test_runner_mylib.ml-gen

我最初认为这意味着我的文件组织不正确。但是,我可以在Helper.bar中访问mylib.ml

代码语言:javascript
复制
$ cat mylib.ml
let foo x = Helper.bar (x + 2)
$ dune build     # no errors

因此,我不知道这里会有什么问题。到底怎么回事?

EN

回答 2

Stack Overflow用户

发布于 2021-10-10 19:25:18

奇怪的是,看起来你需要

代码语言:javascript
复制
(modules)

在您的沙丘文件(如您可以看到的这里)

您的沙丘文件如下所示:

代码语言:javascript
复制
(library
 (name mylib)
 (modules)
 (inline_tests (backend qtest.lib)))
票数 0
EN

Stack Overflow用户

发布于 2021-10-11 13:38:48

沙丘默认情况下将库包装在与库同名的模块中。例如,使用

代码语言:javascript
复制
a.ml
b.ml

将创建一个Mylib模块,AB作为子模块。但是,如果您手工定义了一个mylib模块,沙丘认为这个模块是库的入口点,您有责任公开所有可见子模块。因此,如果将mylib.ml定义为:

代码语言:javascript
复制
let x = 0

您正在显式地隐藏Helper模块。这里更简单的选择可能是重命名Mylib模块。

另一个问题是qtest后端似乎不知道沙丘包装库。一个潜在的解决方法是定义您自己的内联测试后端,并在前导文件中添加一个open Mylib

代码语言:javascript
复制
(library (name myqtest)
 (modules)
 (inline_tests.backend
  (runner_libraries qcheck ounit2 bytes)
  (generate_runner (run qtest extract --preamble "open Myib" --quiet  %{impl-files} %{intf-files}))
 )
)

(library (name mylib) 
 (inline_tests
  (backend myqtest)
 )
)

(我希望我错过了一个选项,并且有一个更简单的解决方案,可以将一个标志发送给转轮生成器)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69514873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档