You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Melange中关联src模块与Melange-Jest测试文件?

解决Melange项目中测试代码无法引用src模块的问题

你的核心问题是:src目录通过melange.emit直接编译模块,导致这些模块无法被测试目录作为库引用——因为同一个模块不能同时属于melange.emit和library stanza。解决思路是把src的模块先封装为一个库,再让src的melange.emit和测试目录的melange.emit都依赖这个库。

步骤1:修改src/dune,拆分library和melange.emit

在src/dune中先定义一个library stanza,把App.re等模块纳入其中;然后让原有的melange.emit依赖这个库,而不是直接编译模块:

;; 定义供测试和自身编译使用的库
(library
 (name my_app) ;; 库名可自定义,后续测试目录要引用这个名字
 (libraries reason-react melange.belt)
 (preprocess
  (pps melange.ppx reason-react-ppx))
 (modules :standard))

;; 原有的前端编译逻辑,改为依赖上面的库
(melange.emit
 (target output)
 (alias app)
 (libraries my_app) ;; 引用自定义库
 (module_systems es6)
 (runtime_deps
  (glob_files_rec assets/*.scss)
  (glob_files_rec assets/*.js)))

步骤2:修改__tests__/dune,添加库依赖

在测试目录的melange.emit的libraries列表中,加入刚才定义的my_app库,同时补上reason-react-ppx(因为测试代码里用了JSX语法):

(melange.emit
 (target test)
 (alias test)
 (libraries
  reason-react
  my_app ;; 添加src的库依赖
  melange-jest.jest
  melange-testing-library.dom
  melange-testing-library.react)
 (preprocess
  (pps melange.ppx reason-react-ppx)))

原理说明

原来的melange.emit直接编译src下的模块,会把这些模块标记为“仅用于当前emit输出”,无法被其他编译单元引用。现在通过library stanza封装模块,让src的emit和测试的emit都依赖这个库,既保证了前端代码正常编译,又让测试代码能合法引用App模块,解决了“Unbound module App”的错误。

内容的提问来源于stack exchange,提问作者Joseph Murrey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 23:47:35