我无法正确配置 jest 来导入模块 (setupFilesAfterEnv)

Ser*_*eni 2 testing typescript jestjs angular ts-jest

我使用它是@angular-builders/jest为了在测试角度项目时用玩笑替换业力。我喜欢有 2 个库为 jest:jest-extended和获取额外的匹配器@testing-library/jest-dom

我找不到自动导入匹配器的方法,这样我就不必在每个规范文件中导入它们。

重现问题的最小示例jest-extended

首先,创建一个 Angular 项目并安装 jest 依赖项

ng new --defaults my-project
cd my-project
yarn add -D jest @types/jest @angular-builders/jest jest-extended
Run Code Online (Sandbox Code Playgroud)

然后编辑angular.json以替换构建器

...
"test": {
    "builder": "@angular-builders/jest:run"
},
Run Code Online (Sandbox Code Playgroud)

到目前为止,我可以使用 jest 和命令运行并通过测试

...
"test": {
    "builder": "@angular-builders/jest:run"
},
Run Code Online (Sandbox Code Playgroud)

现在,我使用一个笑话扩展匹配器添加一个测试。在app.component.spec.ts

...
  it('should work with jest-extended matchers', () => {
    expect([1, 1, 1]).toBeArrayOfSize(3);
  });
Run Code Online (Sandbox Code Playgroud)

尝试#1

创造jest.config.js

ng test
Run Code Online (Sandbox Code Playgroud)

不起作用,我收到错误TS2339: Property 'toBeArrayOfSize' does not exist on type 'ArrayLikeMatchers<number>'

尝试#2

使用中间安装文件;创造jest.config.js

...
  it('should work with jest-extended matchers', () => {
    expect([1, 1, 1]).toBeArrayOfSize(3);
  });
Run Code Online (Sandbox Code Playgroud)

my-jest-setup.ts

import 'jest-extended'
Run Code Online (Sandbox Code Playgroud)

作品!测试通过...但是一旦我更改了规范文件中的某些内容

...
  it('should work with jest-extended matchers', () => {
    expect([1, 1, 1]).toBeArrayOfSize(3);
    expect(true).toBeTruthy();
  });
Run Code Online (Sandbox Code Playgroud)

并再次运行测试,我得到与尝试 #1 相同的错误。我怀疑缓存有问题

解决方法

使用尝试 #2 并在每次运行前清除 jest 缓存

ng test --clearCache && ng test
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个解决方案,因为缓存的目的是加快速度,当有很多规范文件时,每次清除缓存都会产生敏感的影响。此外,我认为在观看模式下使用 jest 时不可能清除缓存

抱歉,有点长,感谢您能读到最后

Ser*_*eni 6

我终于找到了我认为正确的解决方案。从最小的例子开始,用 jest-extend 重现问题

\n\n
    \n
  1. 创建jest.config.js文件(尝试 1 终于是一个好的开始)
  2. \n
\n\n
module.exports = {\n  setupFilesAfterEnv: [\n    \'jest-extended\',\n  ],\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  1. 编辑tsconfig.spec.json并替换"types": ["jasmine", "node"]"types": ["jest", "node", "jest-extended"]
  2. \n
\n\n
{\n  "extends": "./tsconfig.json",\n  "compilerOptions": {\n    "outDir": "./out-tsc/spec",\n    "types": ["jest", "node", "jest-extended"] // <==== what was missing\n  },\n  "files": ["src/test.ts", "src/polyfills.ts"],\n  "include": ["src/**/*.spec.ts", "src/**/*.d.ts"]\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

并瞧\xc3\xa0。这实际上将在编译中包含jestjest-extended声明文件。我现在获得了 TypeScript 类型检查和缓存速度改进的所有好处(显然,第一次运行除外)。

\n\n

我希望这有帮助

\n