为 Angular 配置 Jest

Posted

技术标签:

【中文标题】为 Angular 配置 Jest【英文标题】:Configure Jest for Angular 【发布时间】:2019-01-24 13:11:22 【问题描述】:

根据网络上的各种指南, 就像 this 一样简单:

ng new jest-test
cd jest-test
npm i -D jest jest-preset-angular

修改package.json

"test": "jest",
[...]
"jest": 
    "preset": "jest-preset-angular",
    "setupTestFrameworkScriptFile": "./src/setup-jest.ts"
,

setup-jest.ts

import 'jest-preset-angular';

在运行npm test 时,我一直遇到这个错误:

Jest encountered an unexpected token

This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain javascript.

By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".

Here's what you can do:
 • To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
 • If you need a custom transformation specify a "transform" option in your config.
 • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.

You'll find more details and examples of these config options in the docs:
https://jestjs.io/docs/en/configuration.html

Details:

jest-test/src/app/app.component.spec.ts:1
("Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest)import  TestBed, async  from '@angular/core/testing';
                                                                                                ^

SyntaxError: Unexpected token 

  at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:403:17)

我尝试了无数种配置我在网络上找到的应用程序的变体,都产生了这个错误消息。

如果我需要提供更多信息,请告诉我。

【问题讨论】:

【参考方案1】:

如果您使用 Angular CLI this 库将非常有帮助。 它将使您的工作区远离与 Jest 设置相关的样板代码,并使用 Angular CLI (ng test) 运行您的测试。 这也将省去您配置 Jest 的麻烦。

至于你的具体错误,很可能与你的tsconfig.spec.json有关。您是否将module 字段更改为commonjs?这是使 Jest 工作所必需的。

更多详情请阅读this文章。

免责声明:我是这个库的所有者。

【讨论】:

按照文章中建议的步骤使用 Angular 8,我仍然收到此错误:app.component.spec.ts:1 ("Object.":function(module,exports, require,__dirname,__filename,global,jest)import TestBed, async from '@angular/core/testing'; ^ SyntaxError: Unexpected token "module": "commonjs" is set 请在 Github 上以最少的复制打开一个问题。谢谢。【参考方案2】:

几周前我尝试了这个article。

一切顺利,但我决定不从 Jasmine/Karma 转到 Jest。 原因:

我需要在多个真实浏览器上运行 UT,而 Jest 做不到。 (阅读Jest Repository上的讨论 我可以使用 Jasmin 编写使用 Protractor 或 Selenium-Webdriver 的 e2e 测试

【讨论】:

感谢您的回答。我也关注了这篇文章。他们基本上做同样的设置。对我不起作用。【参考方案3】:

我使用 Ionic,并希望在 Ionic 4 和 Angular 6 中使用 Jest。我找到了this blog post from Brian Love,关注了它,并且能够掌握基础知识。附带说明一下,我在一个外部文件中配置了我的 Jest,内容显示在这里,因为我确实更改了一些东西,但是现在我的测试在 Angular 6 下使用 Jest 运行。

module.exports = 
    collectCoverage: true,
    collectCoverageFrom: [
        "src/**/*.ts"
    ],
    coverageDirectory: "<rootDir>/coverage/",
    coveragePathIgnorePatterns: [
        "node_modules",
        "test-config",
        "<rootDir>/src/app/interfaces",
        "jestGlobalMocks.ts",
        ".module.ts",
        "<rootDir>/src/app/main.ts"
    ],
    ,
    preset: "jest-preset-angular",
    roots: ['src'],
    setupTestFrameworkScriptFile: "<rootDir>/src/setup-jest.ts",
    transformIgnorePatterns: [
        "node_modules/(?!(@ionic-native|@ionic|angularfire2)/)"
    ]

【讨论】:

【参考方案4】:

对我来说,在从头开始一个新的 Angular 项目后,我将其配置为使用 Jest 进行单元测试。我通过查看我的一个旧项目来构建配置,但它适用于 Angular 13 和 Jest 27。

我做了以下配置步骤。并非所有这些都是必需的,但要获得我所做的完整列表,请继续。

    添加到package.jsonscripts

    "test": "jest  --coverage --config ./jest.config.js"
    

    package.json 中删除所有karma 依赖项。

    添加到package.jsondevDependencies(你可能会得到更新的,这些对我来说是最新版本):

    "@babel/core": "~7.16.12",
    "@babel/preset-env": "~7.16.11",
    "@babel/preset-typescript": "~7.16.7",
    "@types/jest": "~27.4.0",
    "babel-jest": "~27.4.6",
    "jest": "~27.4.7",
    "jest-preset-angular": "~11.1.0",
    "ts-jest": "~27.1.3",
    

    compilerOptions / types下添加到tsconfig.spec.ts

    "jest",
    "node"
    

    tsconfig.spec.ts 下的files 中删除:

    "src/test.ts"
    

    删除文件src/test.ts

    添加jest.config.js

    module.exports = 
      globalSetup: 'jest-preset-angular/global-setup',
      cacheDirectory: "<rootDir>/jest/cache",
      clearMocks: true,
      collectCoverage: true,
      coverageDirectory: "<rootDir>/jest/report",
      globals: 
        "ts-jest": 
          tsconfig: "<rootDir>/tsconfig.spec.json",
        
      ,
      moduleFileExtensions: ["ts", "js", "json"],
      preset: "jest-preset-angular",
      setupFilesAfterEnv: ["<rootDir>/setup-jest.ts"],
      "transform": 
        "^.+\\.(ts|js)$": "ts-jest"
      ,
      verbose: true
    
    

    添加babel.config.js:

    module.exports = 
      presets: [
        ['@babel/preset-env',
          
            targets: 
              node: 'current'
            
          
        ],
        '@babel/preset-typescript',
      ]
    ;
    

    运行npm i,你(希望)一切顺利。

【讨论】:

以上是关于为 Angular 配置 Jest的主要内容,如果未能解决你的问题,请参考以下文章

为 Angular 2 配置 history.pushState

如何在 Angular 中为不同的环境设置配置或属性文件?

将 Angular 组件从许多输入/输出重构为单个配置对象

在文件保存时将 Angular 配置为“ng lint”

将 OAuth2 访问令牌配置为 typescript-angular2 客户端

即使 Rails 服务器配置为接受所有请求,Angular 发布请求也未通过预检