使用Jest测试ESM包中的Node.js模块

12

我在思考如何将 esmhttps://www.npmjs.com/package/esm 与 node 后端的 jest 集成。

我尝试使用require("esm")require("esm")(module)在文件的最顶部设置一个安装文件,但仍然出现SyntaxError: Unexpected token错误。

之前我可能会使用node -r esm,但 jest 不支持这种方法。

2个回答

8
当您执行require("esm")(module)时,可以将其视为创建一个待转换为ES模块的esm-transformer函数。
以下是我在node v8+中尝试使用的内容:
- 默认jest配置 - 默认esm配置

enter image description here

utils-1.js:

export const add = (a, b) => a + b;

utils-2.js:

export const multiAdd = array => array.reduce((sum, next) => sum + next, 0)

_test_/utils-1.assert.js

import { add } from '../utils-1';

describe('add(a,b)', () => {
  it('should return the addtion of its two inputs', () => {
    expect(add(1,2)).toBe(3);
  });
});

_test_/utils-2.assert.js

import { multiAdd } from '../utils-2';

describe('multiAdd(<Number[]>)', () => {
  it('should return a summation of all array elements', () => {
    expect(multiAdd([1,2,3,4])).toBe(10);
  })
});

_test_/utils.test.js

const esmImport = require('esm')(module);
const utils_1 = esmImport('./utils-1.assert')
const utils_2 = esmImport('./utils-2.assert')

enter image description here

希望这有所帮助!

2
这对我来说比文档更有意义。 - A. L
3
实际上,multiAdd 可以简单地使用 array.reduce(add,0) - Jason J. Nathan
我已经做了这个,但出于某些原因,我丢失了jest变量,所以我无法执行jest.spyOn等操作。 - Giancarlo Corzo
@GiancarloCorzo 重新分配jest全局变量似乎可以解决这个问题: const originalJest = jest; const esmImport = require('esm')(module); global.jest = originalJest - Stradivariuz
2
什么?你甚至没有在这个例子中使用esm包。这怎么能成为一个被接受的答案呢? - Andrew Koster
1
@AndrewKoster - 正在使用esm模块,但是像这样:const esmImport = require('esm')(module); - Lee Goddard

0

如果有人仍在寻找答案,接受的答案确实需要一些努力。

您还可以使用esm包与jest一起使用,通过使用jest-esm-transformer-2(或jest-esm-transformer,如果您使用的是jest<28)将esm文件转换回cjs。

  1. 安装包npm i jest-esm-transformer-2 --save-dev
  2. 在根目录中创建您的jest.config.js并配置代码转换以使用jest-esm-transformer-2

const config = {
  transform: {
    '.js': 'jest-esm-transformer-2'
  }
}

module.exports = config

  1. 以无标志等方式运行 jest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接