Jest を最新の angular バージョンと統合する


jest が単体テストで勢いを増しているため、angular コンポーネントを最新の angular バージョン (12+) と統合する方法を見てみましょう.
  • npm uninstall -D @types/jasmine jasmine jasmine-core jasmine-spec-reporter karma karma-chrome-launcher karma-coverage karma-jasmine karma-jasmine-html-reporter ts-node
  • を使用してジャスミンとカルマをアンインストールします
  • npm i -D @types/jest jest jest-preset-angular @angular-builders/jest
  • を使用して jest をインストールします
  • ルートにファイル setupJest.ts を作成し、コンテンツの下に追加します

  • import { getTestBed } from '@angular/core/testing';
    import {
      BrowserDynamicTestingModule,
      platformBrowserDynamicTesting,
    } from '@angular/platform-browser-dynamic/testing';
    import 'jest-preset-angular';
    import 'zone.js';
    import 'zone.js/testing';
    
    getTestBed().initTestEnvironment(
      BrowserDynamicTestingModule,
      platformBrowserDynamicTesting(),
      {
        teardown: { destroyAfterEach: true },
      }
    );
    
    Object.defineProperty(window, 'CSS', { value: null });
    Object.defineProperty(window, 'getComputedStyle', {
      value: () => {
        return {
          display: 'none',
          appearance: ['-webkit-appearance']
        };
      }
    });
    Object.defineProperty(document, 'doctype', {
      value: '<!DOCTYPE html>'
    });
    Object.defineProperty(document.body.style, 'transform', {
      value: () => {
        return {
          enumerable: true,
          configurable: true
        };
      }
    });
    
    


  • ng upgrade を使用して低角度バージョンから移行する場合、上記のコードを除いて、src/test.ts ファイルで他のコードを使用している場合は、その新しいコンテンツを setupJest.ts に追加し、src/test.ts を削除します
  • ルートにファイル jest.config.js を作成し、コンテンツの下に追加します

  • module.exports = {
      preset: 'jest-preset-angular',
      roots: ['<rootDir>/src'],
      testMatch: ['**/+(*.)+(spec).+(ts)'],
      collectCoverage: true,
      coverageReporters: ['html', 'lcov', 'json', 'text'],
      coverageDirectory: '<rootDir>/coverage',
      moduleFileExtensions: ['ts', 'html', 'js', 'json'],
    };
    


  • testangular.json 部分を以下の内容に置き換えます

  • ...
    "test": {
      "builder": "@angular-builders/jest:run",
      "options": {
        "main": ["setupJest.ts"],
        "tsConfig": "src/tsconfig.spec.json",
        "no-cache": true
      }
    }
    ...
    


  • "esModuleInterop": truecompilerOptionstsconfig.json を追加
  • tsconfig.spec.json を開き、jasmine フィールド
  • jesttypes に置き換えます.

    これで、jest は最新の angular と完全に統合されました 👏 💥

    お読みいただきありがとうございます

    サンプルリポジトリ here を見つけることができます