运行 使用 Jasmine 或任何其他替代方案在 Node 上测试 .mjs / ESM
Running tests .mjs / ESM on Node using Jasmine or any other alternative
由于 --experimental-modules
CLI 开关(即 node --experimental-modules
),我的基于 Node 的项目是在 Node 上使用本机 ES 模块支持实现的。
显然,当我 运行 使用 Jasmine node --experimental-modules ./node_modules/jasmine/bin/jasmine
的规范时,我收到以下错误:
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module
是否可以在 Node 中通过 ES 模块使用 Jasmine?
如果不是,是否有任何替代方法 不使用框架(例如 运行使用 npm
脚本进行测试)?
这比我想象的要容易。
它只是关于调用一个文件,您可以按如下方式调用 run.mjs
:
node --experimental-modules ./run.mjs
整个文件看起来像这样:
jasmine.mjs
:
import Jasmine from "jasmine"
import JasmineConsoleReporter from "jasmine-console-reporter"
const jasmine = new Jasmine()
jasmine.loadConfigFile( "./support/jasmine.json" )
jasmine.env.clearReporters()
jasmine.addReporter( new JasmineConsoleReporter( {
colors: true,
cleanStack: true,
verbosity: 4,
listStyle: 'indent',
activity: false
} ) )
export default jasmine
您可以在单独的文件中添加如下规格:
import jasmine from './my-project/spec/jasmine.mjs'
jasmine.env.describe('Foo', () => {
jasmine.env.it('Bar', () => {
// Expects, assertions...
})
})
最后,您将 运行 jasmine
导入已配置的 jasmine
实例和规范:
import jasmine from './my-project/spec/jasmine.mjs'
import someSpec1 from './my-project/spec/someSpec1.mjs'
import someSpecN from './my-project/spec/someSpecN.mjs'
someSpec1()
someSpecN()
jasmine.execute()
简化@Matias_Fidemraizer的解决方案,只保留一个文件中的重要位:
import glob from 'glob';
import Jasmine from 'jasmine';
const jasmine = new Jasmine();
jasmine.loadConfigFile('tests/jasmine.json');
// Load your mjs specs
glob('**/*-test.mjs', function (er, files) {
Promise.all(
files
// Use relative paths
.map(f => f.replace('tests/specs/', './'))
.map(f => import(f)
.catch(e => {
console.error('** Error loading ' + f + ': ');
console.error(e);
process.exit(1);
}))
)
.then(() => jasmine.execute());
});
并用
执行
node --experimental-modules jasmine-run.mjs
您会在日志中遇到一些问题,收到类似
的消息
[...] .split('\n') [...]
该消息表示您的 mjs 代码出现异常。
由于 --experimental-modules
CLI 开关(即 node --experimental-modules
),我的基于 Node 的项目是在 Node 上使用本机 ES 模块支持实现的。
显然,当我 运行 使用 Jasmine node --experimental-modules ./node_modules/jasmine/bin/jasmine
的规范时,我收到以下错误:
Error [ERR_REQUIRE_ESM]: Must use import to load ES Module
是否可以在 Node 中通过 ES 模块使用 Jasmine?
如果不是,是否有任何替代方法 不使用框架(例如 运行使用 npm
脚本进行测试)?
这比我想象的要容易。
它只是关于调用一个文件,您可以按如下方式调用 run.mjs
:
node --experimental-modules ./run.mjs
整个文件看起来像这样:
jasmine.mjs
:
import Jasmine from "jasmine"
import JasmineConsoleReporter from "jasmine-console-reporter"
const jasmine = new Jasmine()
jasmine.loadConfigFile( "./support/jasmine.json" )
jasmine.env.clearReporters()
jasmine.addReporter( new JasmineConsoleReporter( {
colors: true,
cleanStack: true,
verbosity: 4,
listStyle: 'indent',
activity: false
} ) )
export default jasmine
您可以在单独的文件中添加如下规格:
import jasmine from './my-project/spec/jasmine.mjs'
jasmine.env.describe('Foo', () => {
jasmine.env.it('Bar', () => {
// Expects, assertions...
})
})
最后,您将 运行 jasmine
导入已配置的 jasmine
实例和规范:
import jasmine from './my-project/spec/jasmine.mjs'
import someSpec1 from './my-project/spec/someSpec1.mjs'
import someSpecN from './my-project/spec/someSpecN.mjs'
someSpec1()
someSpecN()
jasmine.execute()
简化@Matias_Fidemraizer的解决方案,只保留一个文件中的重要位:
import glob from 'glob';
import Jasmine from 'jasmine';
const jasmine = new Jasmine();
jasmine.loadConfigFile('tests/jasmine.json');
// Load your mjs specs
glob('**/*-test.mjs', function (er, files) {
Promise.all(
files
// Use relative paths
.map(f => f.replace('tests/specs/', './'))
.map(f => import(f)
.catch(e => {
console.error('** Error loading ' + f + ': ');
console.error(e);
process.exit(1);
}))
)
.then(() => jasmine.execute());
});
并用
执行node --experimental-modules jasmine-run.mjs
您会在日志中遇到一些问题,收到类似
的消息[...] .split('\n') [...]
该消息表示您的 mjs 代码出现异常。