我正在尝试使用webpack将测试捆绑到一个我可以直接传递给mocha的包中。我的webpack配置看起来像这样:
module.exports = {
entry: ...,
output: ...,
module: {
rules: [
{
test: /\.jsx?(.erb)?$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
presets: [
'react',
[ 'latest', { 'es2015': { 'modules': false } } ]
]
}
}
]
},
plugins: [],
resolve: {
extensions: [ '.js', '.jsx' ],
modules: [
path.resolve('../app/javascript'),
path.resolve('../vendor/node_modules')
]
},
resolveLoader: {
modules: [ path.resolve('../vendor/node_modules') ]
}
}
(来自https://github.com/rails/webpacker)
我的切入点看起来像这样,我见过其他地方的引用:
var context = require.context('../path/to/tests', true, /.+\.test\.js?$/);
context.keys().forEach(context);
module.exports = context;
现在这个工作,并生成一个bundle,比如tests.js,我可以传递给mocha:
$ mocha tests.js
但是,这使得webpack每次更改某些内容时都会重新编译所有测试文件,这非常慢。对于我的应用程序代码,我使用常规import语句导入模块,webpack只重新编译已更改的文件。
将我的切入点更改为:
require('../path/to/tests/foo.test.js');
require('../path/to/tests/bar.test.js');
require('../path/to/tests/baz.test.js');
...
似乎有所需的效果,但有数百个测试文件,手动导入或需要每个测试文件似乎很麻烦。
答案 0 :(得分:0)
Webpack正在重新编译您的测试,因为您正在使用require.context
。使用它的文档是here。通常,在使用mocha运行一系列测试时,您只需使用mocha ../path/**.test.js
即可运行所有测试。当然,如果您使用来自不受Node支持的js的新功能,这将不起作用。
解决这个问题的一种方法是将编译器选项传递给mocha,它将使用babel。可以在this blog post上找到更详细的说明。一般的想法是运行带有--compilers js:babel-core/register
的mocha,它会找到您的.babelrc
文件。
如果您使用的是mac或Linux,则可以使用以下命令编写bash表达式,以便更轻松地查找所有测试。
find ./path -name '*.test.js' | xargs mocha