如何使用es2015模块中可用的导入库运行Jest测试? (偶然遇到意外的令牌错误)

时间:2019-04-30 16:11:02

标签: typescript

我有两个npm软件包。我提供了到存储库的直接链接,还提供了下面的相关代码段和描述。

以下是问题的摘要以及下面的详细内容

  • 项目1使用TypeScript选项"module": "es2015"编译其代码
  • 项目2将项目1作为依赖项。该项目有一个测试文件,该文件测试一个对象,该对象从导入的项目1中调用代码。
  • 当我们运行此Project 2测试时,Jest给出了一个错误。该错误基本上表示导入的库的代码中有错误。
  • 在项目1中,我将TypeScript选项更改为其他名称,或者忽略了它,编译后的代码当然不是es2015,但是项目2测试有效。
  • 如何使Jest测试与导入的库中的es2015选项一起使用?

以下是详细信息

Here是一个非常简单的TypeScript npm模块,我们将其称为项目1。它具有一个index.ts文件,该文件导出其中包含一种方法的对象。我执行了yarn tsc,在index.js文件夹中生成了一个./lib文件,并带有一个自动生成的声明文件index.d.ts。我已经忽略了src/index.ts,因此该仓库仅显示lib文件夹,如果该仓库作为npm模块在npm注册表中发布,它将可用。

这些是相关文件:

// tsconfig.js
{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "experimentalDecorators": true,
    "moduleResolution": "node",
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "sourceMap": false,
    "target": "es5",
    "module": "es2015",
    "skipLibCheck": true,
    "strict": true,
    "resolveJsonModule": true,
    "outDir": "./lib",
    "declaration": true
  },
  "exclude": ["node_modules", "lib"]
}
// package.json
{
  "name": "TypedNpmModule",
  "version": "1.0.0",
  "description": "",
  "main": "./lib/index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "tsc": "tsc"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {},
  "devDependencies": {
    "prettier": "^1.17.0",
    "typescript": "^3.4.5"
  }
}
// src/index.ts
export const myObject = {
  method1: function(str: string) {
    return str;
  }
};

TypeScript生成的.js文件是

export var myObject = {
  method1: function(str) {
    return str;
  },
};

Here是一个非常简单的TypeScript npm模块,我们将其称为项目2,它导入了项目1。它有一个index.ts导出了一个actions对象,该对象的方法只是调用从项目1中导出的对象中获得的方法:

// src/index.ts
import { myObject } from 'TypedNpmModule';

export const actions = {
  meth1: myObject.method1('hello'),
};

该项目使用Jest测试调用此actions对象:

// src/__tests__/index.test.js
import { actions } from '../index';

test('actions', () => {
  const result = actions.meth1('hello');
  expect(result).toMatchSnapshot();
});
// package.json
{
  "name": "Jest1",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/jest": "^24.0.12",
    "jest": "^24.7.1",
    "prettier": "^1.17.0",
    "ts-jest": "^24.0.2",
    "typescript": "^3.4.5"
  },
  "dependencies": {
    "TypedNpmModule": "evian-pring/TypedNpmModule#master"
  },
  "jest": {
    "transform": {
      "^.+\\.tsx?$": "ts-jest"
    }
  }
}

这是问题所在

当我使用npx jest运行Jest测试时,出现错误:

enter image description here

1 个答案:

答案 0 :(得分:0)

问题在于,Jest默认情况下会忽略node_modules中的所有文件。因此,没有任何转换应用于任何外部库。我在另外this个线程中读到,ts-jest要求文件使用commonjs,并且由于project1的文件正在使用ES6本机模块,因此会出现错误。

解决方案:

  • project 2中,告诉Jest不要忽略project1软件包。这是在Jest配置中的键transformIgnorePatterns下完成的。进一步了解该here
  • project 2中,正确安装babel:除了babel-jest,我们还需要@babel/core@babel/preset-coreyarn add --dev @babel/core @babel/preset/core babel-jest
  • 我认为从Babel 7开始,这也是一个要求:使用babel.config.js文件而不是.babelrc文件。 Here是为什么。这就是project2的样子
module.exports = function(api) {
  api.cache(true);

  const presets = ["@babel/env"];

  return {
    presets
  };
};

另请参阅问题中链接的存储库以获取工作代码。