我正在尝试使用Babel的“模块别名”插件和“proxyquire”测试库,但我没有太多运气。
图书馆背景
(如果您熟悉模块别名/代理请求,请随时跳过)
Proxyquire让你模拟出模块的依赖性以进行测试,如下所示:
const someFunctionToTest =
proxyquire(pathToSomeFunctionToTestsModule, {
pathToDependency: fakeVersionOfDependency
});
Babel的模块别名插件让您可以使导入路径更加方便和一致。例如,我可以指定(在.babelrc中):
"plugins": [
["module-alias", [
{ "src": "./", "expose": "~" }
]],
然后不必键入(从嵌套三个目录深度的模块导入时)require('../../../someModule') I can just type
require('〜/ someModule')`。
问题
我的问题是,他们不能一起工作。如果我的someModule
取决于someDependency
:
// src/someModule.js
const someDependency = require('~/src/someDependency');
doSomethingWith(someDependency);
然后我想用模拟版someModule
测试someDependency
,我应该可以这样做:
const proxiedSomeModule =
proxyquire('~/src/someModule', {
'~/src/someDependency': fakeVersionOfSomeDependency
});
...但proxyquire
告诉我'错误:无法找到模块'〜/ src / someModule'。
据推测(“幕后”)Babel正在将'〜/ src / someModule'转换为其真实路径,因此当Proxyquire查找别名路径时,它无法找到它。
问题
我的问题是:在Babel转换它之后,有什么方法可以找出'〜/ src / someModule'的真实路径(即,当proxyquire处理它时)?或者有没有办法让proxyquire只使用别名路径?
答案 0 :(得分:0)
事实证明,模块解析器生成的“真实”路径('~/someModule'
)只是../../someModule
路径。但是,事实证明,无需手动转换路径。
模块解析器插件会将参数转换为transformFunctions
列表中的任何函数。这意味着您可以通过执行以下操作将任何字符串转换为其非别名形式:
const resolveModulePath = path => path;
将该功能(以及proxyquire
)添加到transformFunctions
中的.babelrc
列表中:
[“module-resolver”,{
“transformFunctions”:[“proxyquire”,“resolveModulePath”]
}]
使用resolveModulePath
:
proxyquire('〜/ some / path / someModule',{
[resolveModulePath('〜/ some / other / path')]:{
someFunction:fakeSomeFunction
}
})
请注意,上面的第一个路径不需要转义,因为它是转换函数的参数。只需要包装第二条路径('~/some/other/path'
),因为它是一个参数的一部分;
字符串本身不是参数,直到它被包装。
有关详细信息,请参阅:https://github.com/tleunen/babel-plugin-module-resolver/issues/241#issuecomment-350109168