Angular Cli でプロジェクトを作成すると Karma + Jasmine が単体テストとして入るため
Jest に変更する手順を備忘録として残しておく

構築環境

Angular CLI: 7.3.9
Node: 10.15.3
OS: darwin x64
Angular:
...

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.13.9
@angular-devkit/core         7.3.9
@angular-devkit/schematics   7.3.9
@schematics/angular          7.3.9
@schematics/update           0.13.9
rxjs                         6.3.3
typescript                   3.2.4

手順

  1. プロジェクトを作成

    ng new JEST-EXAMPLE --style=styl
    ? Would you like to add Angular routing? Yes
    
  2. 以下のコマンドを実行する

    yarn global add @briebug/jest-schematic
    ng g @briebug/jest-schematic:add
    ng add @briebug/jest-schematic
    
  3. 以下のコマンドを実行して動作確認する

    yarn test
    jest
    PASS  src/app/app.component.spec.ts
    AppComponent
        ✓ should create the app (89ms)
        ✓ should have as title 'JEST-EXAMPLE' (28ms)
        ✓ should render title in a h1 tag (29ms)
    
    Test Suites: 1 passed, 1 total
    Tests:       3 passed, 3 total
    Snapshots:   0 total
    Time:        3.913s
    Ran all test suites.
    ✨  Done in 4.76s.
    

    上記だけでも動くが snapshot テストを行うためには以下が追加で必要

  4. src/app/app.component.spec.ts を修正

    import { TestBed, async } from '@angular/core/testing';
    import { RouterTestingModule } from '@angular/router/testing';
    import { AppComponent } from './app.component';
    
    describe('AppComponent', () => {
      beforeEach(async(() => {
        TestBed.configureTestingModule({
          imports: [
            RouterTestingModule
          ],
          declarations: [
            AppComponent,
          ],
        }).compileComponents();
      }));
    
      describe('snapshots', () => {
        it('正しく render されること', () => {
          const fixture = TestBed.createComponent(AppComponent);
          expect(fixture).toMatchSnapshot();
        });
      });
    });
    
  5. src/tsconfig.spec.json を修正

    {
      "extends": "../tsconfig.json",
      "compilerOptions": {
        "outDir": "../out-tsc spec",
        "types": [
          "jasmine", //=> "jest"
          "node"
        ],
        "module": "commonjs"
      },
      "files": [
        "polyfills.ts"
      ],
      "include": [
        "**/*.spec.ts",
        "**/*.d.ts"
      ]
    }
    
  6. src/angular.json から以下を削除

    {
      ・・・
      "test": {
        "builder": "@angular-devkit/build-angular:karma",
        "options": {
          "main": "src/test.ts",
          "polyfills": "src/polyfills.ts",
          "tsConfig": "src/tsconfig.spec.json",
          "karmaConfig": "src/karma.conf.js",
          "styles": [
            "src/styles.styl"
          ],
          "scripts": [],
          "assets": [
            "src/favicon.ico",
            "src/assets"
          ]
        }
      },
      ・・・
    }
    
  7. 以下のコマンドを実行する

    yarn remove @types/jasmine @types/jasminewd2
    yarn add @types/jest
    
  8. 以下のコマンドを実行して動作確認する

    jest
    PASS  src/app/app.component.spec.ts
    AppComponent
        snapshots
        ✓ 正しく render されること (109ms)
    
    Test Suites: 1 passed, 1 total
    Tests:       1 passed, 1 total
    Snapshots:   1 passed, 1 total
    Time:        1.711s, estimated 3s
    Ran all test suites.
    ✨  Done in 2.43s.