Using Vitest with An Angular Project
Vitest can be added to any existing Angular project with a few steps.
Automated Setup Using a Schematic/Generator
Vitest can be installed and setup using a schematic/generator for Angular CLI or Nx workspaces.
First, install the @analogjs/platform package:
- npm
- Yarn
- pnpm
npm install @analogjs/platform --save-dev
yarn add @analogjs/platform --dev
pnpm install -w @analogjs/platform --save-dev
Next, run the schematic to set up the Vite config, test configuration files, and update the test configuration.
ng g @analogjs/platform:setup-vitest --project [your-project-name]
Next, go to running tests
Manual Installation
To add Vitest manually, install the necessary packages:
- npm
- Yarn
- pnpm
npm install @analogjs/vite-plugin-angular @analogjs/vitest-angular jsdom --save-dev
yarn add @analogjs/vite-plugin-angular @analogjs/vitest-angular jsdom --dev
pnpm install -w @analogjs/vite-plugin-angular @analogjs/vitest-angular jsdom --save-dev
Setup for Running Tests for Node
To setup Vitest, create a vite.config.ts at the root of your project:
/// <reference types="vitest" />
import { defineConfig } from 'vite';
import angular from '@analogjs/vite-plugin-angular';
export default defineConfig(({ mode }) => ({
  plugins: [angular()],
  test: {
    globals: true,
    setupFiles: ['src/test-setup.ts'],
    environment: 'jsdom',
    include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
    reporters: ['default'],
  },
  define: {
    'import.meta.vitest': mode !== 'production',
  },
}));
Next, define a src/test-setup.ts file to setup the TestBed:
Zone.js setup
If you are using Zone.js for change detection, import the setup-zone script. This script automatically includes support for setting up snapshot tests.
import '@analogjs/vitest-angular/setup-zone';
import {
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting,
} from '@angular/platform-browser-dynamic/testing';
import { getTestBed } from '@angular/core/testing';
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting()
);
Zoneless setup
If you are using Zoneless change detection, only import the setup-snapshots script.
import '@analogjs/vitest-angular/setup-snapshots';
import {
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting,
} from '@angular/platform-browser-dynamic/testing';
import { getTestBed } from '@angular/core/testing';
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting()
);
Next, update the test target in the angular.json to use the @analogjs/vitest-angular:test builder:
{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "your-project": {
      "projectType": "application",
      "architect": {
        "build": ...,
        "serve": ...,
        "extract-i18n": ...,
        "test": {
          "builder": "@analogjs/vitest-angular:test"
        }
      }
    }
  }
}
You can also add a new target and name it
vitestto run alongside yourtesttarget.
Lastly, add the src/test-setup.ts to files array in the tsconfig.spec.json in the root of your project, set the target to es2016, and update the types.
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/spec",
    "target": "es2016",
    "types": ["vitest/globals", "node"]
  },
  "files": ["src/test-setup.ts"],
  "include": ["src/**/*.spec.ts", "src/**/*.d.ts"]
}
Next, go to running tests
Setup for Running Tests in the Browser
If you prefer to run your tests in a browser, Vitest has experimental support for browser testing also.
First, follow the steps for running tests in node.
Then, install the necessary packages for running tests in the browser:
- npm
- Yarn
- pnpm
npm install @vitest/browser playwright --save-dev
yarn add @vitest/browser playwright --dev
pnpm install -w @vitest/browser playwright
Update the test object in the vite.config.ts.
- Remove the environment: 'jsdom'property.
- Add a browserconfig for Vitest.
/// <reference types="vitest" />
import { defineConfig } from 'vite';
import angular from '@analogjs/vite-plugin-angular';
export default defineConfig(({ mode }) => ({
  plugins: [angular()],
  test: {
    globals: true,
    setupFiles: ['src/test-setup.ts'],
    // environment: 'jsdom',
    include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
    reporters: ['default'],
    // Vitest browser config
    browser: {
      enabled: true,
      name: 'chromium',
      headless: false, // set to true in CI
      provider: 'playwright',
    },
  },
  define: {
    'import.meta.vitest': mode !== 'production',
  },
}));
Next, add the @angular/compiler import to the src/test-setup.ts file.
import '@angular/compiler';
import '@analogjs/vitest-angular/setup-zone';
import {
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting,
} from '@angular/platform-browser-dynamic/testing';
import { getTestBed } from '@angular/core/testing';
getTestBed().initTestEnvironment(
  BrowserDynamicTestingModule,
  platformBrowserDynamicTesting()
);
Running Tests
To run unit tests, use the test command:
- npm
- Yarn
- pnpm
npm run test
yarn test
pnpm test
The
npx vitestcommand can also be used directly.