我有react 应用程序,使用Milkdown编辑器.我想使用JEST测试这个应用程序.每当我运行导入Milkdown模块的JEST测试时,我都会收到以下错误:

Cannot find module '@milkdown/core' from 'src/MilkdownEditor.tsx'

我认为这个问题与@milkdown/core是一个esm模块有关.

有人能帮我了解一下在这种情况下应该如何配置JEST吗?

当前JEST配置:

import type { Config } from 'jest'

const config: Config = {
  preset: 'ts-jest',
  testEnvironment: 'jsdom',
  setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
  injectGlobals: true,
}

export default config

样本测试:

import React from 'react'
import { render } from '@testing-library/react'
import MilkdownEditor from '../src/MilkdownEditor'

test('test milkdown editor', () => {
  render(<MilkdownEditor />)
})

I created minimal project that reproduces the issue

我已经try 应用了一些建议(主要与配置巴别塔相关),但都没有用.

推荐答案

在进一步研究之后,我想出了两个解决这个问题的方法:

Solution 1

按照jest documentation中的建议,使用--experimental-vm-modules可以很好地工作.要使其正常工作,需要遵循以下jest.config.js条:

import type { Config } from 'jest'

const config: Config = {
  preset: 'ts-jest/presets/default-esm',
  testEnvironment: 'jsdom',
  setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
  injectGlobals: true,
}

export default config

并且为了更容易地运行测试,可以在package.jsonscript部分中定义以下npm脚本:

"scripts": {
  "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest"
},

Full implementation of this solution

Solution 2

该解决方案基于Babel @babel/plugin-transform-modules-commonjs.这是常见的解决方案,可以在周围找到.然而,在此特定场景中,需要JEST配置(moduleNameMapper)中的附加模块名称映射.目前我不能解释这是什么原因.此外,有必要将巴别塔变换应用于node_modules,这是通过重写transformIgnorePatters来完成的.所以jest.config.js看起来是这样的:

import type { Config } from 'jest'

const config: Config = {
  preset: 'ts-jest',
  transform: {
    "^.+\\.[t]sx?$": "ts-jest",
    "^.+\\.[j]sx?$": "babel-jest"
  },
  transformIgnorePatterns: [
  ],
  moduleNameMapper: {
    "^@milkdown/prose/(.*)$": "<rootDir>/node_modules/@milkdown/prose/lib/$1.js",
    "^@milkdown/(.*)$": "<rootDir>/node_modules/@milkdown/$1"
  },
  testEnvironment: 'jsdom',
  setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
  injectGlobals: true,
}

export default config

低于babel.config.js的内容:

module.exports = {
  plugins: [
    "@babel/plugin-transform-modules-commonjs"
  ]
}

Full implementation for this solution

Node.js相关问答推荐

EJS ForEach循环标记

控制台显示一个长对象,我可以';每当我发布更新Mongoose数据库的请求时,我都不知道错误是什么,

Sequelize、postgres和posgis:在n°;公里

Node.js 连接在查询完成之前终止

Redis Typescript 删除方法类型转换

数据未被中间件解析

使用 Nodejs 获取 Firebase 云消息传递历史记录

TypeError:在使用 Jest、Supertest、Express、Typescript 进行测试时无法读取未定义的属性(读取listen)

Axios GET 返回不可读的响应

Nodejs mongoose 在一个查询中从多个集合中获取结果

在 `DataFrame` 上使用用户定义的可链接函数抽象出 Polars 表达式

node_modules 中 .bin 文件夹的用途是什么?

bash:npm:找不到命令?

如何在 node 调试器中禁用第一行中断

Mongodb v4.0 Transaction, MongoError: Transaction numbers are allowed on a replica set member or mongos

ISODate 未定义

ChildProcess 关闭、退出事件之间的区别

如何在 Joi 字符串验证中使用枚举值

通过 POST 请求将数据从 node.js 服务器发送到 node.js 服务器

异步构造函数