如何在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
相关产品推荐
相关产品推荐

