从 Jasmine/Karma 迁移到 Jest 是不是可行?

Posted

技术标签:

【中文标题】从 Jasmine/Karma 迁移到 Jest 是不是可行?【英文标题】:Is it feasible to migrate from Jasmine/Karma to Jest?从 Jasmine/Karma 迁移到 Jest 是否可行? 【发布时间】:2019-08-11 14:21:03 【问题描述】:

我有一个包含 3300 多个测试的 Angular 7 应用程序。而且它们需要花费太多时间来运行,并且需要花费太多精力来维护。我听说过很多关于 Jest 的好消息,但不确定将所有这些测试从 Jasmine 迁移到 Jest 是否真的可行。

【问题讨论】:

这是一个相当宽泛的问题,但我会说Jest 是基于Jasmine 的,因此肯定会降低工作量,因为它们的行为相似并共享许多相同的语法。 3300+ 是要迁移的大量测试。这将花费你很长时间。在指责测试框架之前,我可能会想看看为什么这些测试缓慢且不稳定,因为在 Jest 中可能会犯所有相同的错误。 同意这个问题是广泛而固执的。在维护方面,Jest 并没有足够的不同(我已经使用了这两种方法,现在又回到了 Karma 上)。 “可行”取决于时间、技能、预算、第一个测试的编写情况,以及所有不允许这里任何人有效回答的噪音。是的,您可以迁移。我已经开始使用 ng-bullet,它对性能有所帮助。运行我的测试最长的部分之一是编译。我创建了许多项目特定的帮助程序,使编写测试变得轻而易举(如果你觉得你经常键入/复制/粘贴)。 【参考方案1】:

您可以通过升级到 jest 来轻松回答这个问题。 Github by the jest-preset-angular team 上有一个很棒的演练。

在您的项目根目录中添加一些文件:

setup.jest.ts 与:

import 'jest-preset-angular/setup-jest';

jest.config.js 与:

// Angular Ivy (9+ only for the next line)
require('jest-preset-angular/ngcc-jest-processor');

// jest.config.js
module.exports = 
  preset: 'jest-preset-angular',
  setupFilesAfterEnv: ['<rootDir>/setup-jest.ts'],
;

tsconfig.spec.json 与:


  "extends": "./tsconfig.json",
  "compilerOptions": 
    "outDir": "./out-tsc/spec",
    "types": ["jest"]
  ,
  "include": ["src/**/*.spec.ts", "src/**/*.d.ts"]

修改tsconfig.json:

  "lib": [ "es2018", "dom" ],
  "esModuleInterop": true

修改tsconfig.spec.json:

"types": [ "jest" ] // Replace "jasmine"

修改package.json

"test": "jest -c ./jest.config.js ./src

添加所需的包:

npm install jest jest-preset-angular @types/jest @angular-builders/jest

安装后迁移

然后您可以自动 transform 您的测试(在某种程度上)从 Jasmine 到 Jest:

npx jest-codemods

现在您可以针对特定项目回答您的问题

运行:

npm run test

查看您需要手动修复多少失败的测试才能完成迁移。并决定这是否在您的时间范围内。

疑难解答

错误:无法设置基本提供程序,因为它已被调用

查找tests.ts 文件并将其删除。这是 Jest 中不需要的 karma 文件。

【讨论】:

以上是关于从 Jasmine/Karma 迁移到 Jest 是不是可行?的主要内容,如果未能解决你的问题,请参考以下文章

Karma 没有在 Jenkins CI 中运行,找不到模块 'karma-jasmine'

Angular - Jasmine/karma - 订阅 lambda 表达式未执行

在Visual Studio 2013中使用Jasmine + Karma进行AngularJS测试

使用 Angular 和 Jasmine/Karma 的私有方法进行测试和代码覆盖

Karma + Jasmine 下 angular.mock.inject 的 TypeScript AngularJS 控制器测试问题

如何在 (jasmine + karma) 中为以下方法编写测试,该方法在构造函数中注入了 ComponentFactoryResolver 和 ApplicationRef