2

在测试角度项目时,我使用@angular-builders/jest它是为了用玩笑来替换业力。有 2 个库我喜欢为玩笑获得额外的匹配器: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

然后编辑angular.json以替换生成器

...
"test": {
    "builder": "@angular-builders/jest:run"
},

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

ng test

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

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

尝试#1

创造jest.config.js

module.exports = {
  setupFilesAfterEnv: [
    'jest-extended',
  ],
};

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

尝试#2

使用中间设置文件;创造jest.config.js

module.exports = {
  setupFilesAfterEnv: [
    'my-jest-setup.ts',
  ],
};

my-jest-setup.ts

import 'jest-extended'

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

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

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

解决方法

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

ng test --clearCache && ng test

我不喜欢这种解决方案,因为缓存旨在加快速度,并且当有许多规范文件时,每次清除缓存都会产生敏感影响。此外,我认为在手表模式下使用 jest 时不可能清除缓存

抱歉,有点长,谢谢你读到最后

4

2 回答 2

4

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

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

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

我希望这有帮助

于 2019-11-25T23:37:01.093 回答
2

我想我找到了解决办法。诀窍是简单地启用一个ts-jest选项jest.config.js

module.exports = {
  setupFilesAfterEnv: ['jest-extended'],
  globals: {
    'ts-jest': {
      isolatedModules: true,
    },
  },
};

我不得不承认我不理解这个选项的目标,因此,任何启示都将受到高度赞赏。

作为奖励,测试执行速度更快。

到目前为止没有明显的缺点,但如果发生奇怪的事情,我会让你知道。

我希望这有帮助

编辑:实际的缺点是当 ts-jest 编译运行测试时我们会松散类型检查。该isolatedModules选项的目标在ts-jest 文档中进行了说明

于 2019-08-10T17:00:40.697 回答