Adding Vitest To An Existing Project
Vitest can be added to existing Angular workspaces with a few steps.
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
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/platform jsdom @nx/vite --save-dev
yarn add @analogjs/vite-plugin-angular @analogjs/platform jsdom @nx/vite --dev
pnpm install -w @analogjs/vite-plugin-angular @analogjs/platform jsdom @nx/vite
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
:
import '@analogjs/vite-plugin-angular/setup-vitest';
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/platform:vitest
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/platform:vitest"
}
}
}
}
}
You can also add a new target and name it
vitest
to run alongside yourtest
target.
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
browser
config 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',
},
}));
Running Tests
To run unit tests, use the test
command:
- npm
- Yarn
- pnpm
npm run test
yarn test
pnpm test
Snapshot Testing
For snapshot testing you can use toMatchSnapshot
from expect
API.
Below is a small example of how to write a snapshot test:
// card.component.spec.ts
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { CardComponent } from './card.component';
describe('CardComponent', () => {
let fixture: ComponentFixture<CardComponent>;
let component: CardComponent;
beforeEach(() =>
TestBed.configureTestingModule({
imports: [CardComponent],
})
);
beforeEach(() => {
fixture = TestBed.createComponent(CardComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create the app', () => {
expect(fixture).toMatchSnapshot();
});
After you run the test, a card.component.spec.ts.snap
file is created in the__snapshots__
folder with the below content:
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
exports[`CardComponent > should create the app 1`] = `
<component-code>
`;
The snapshots generated should be reviewed and added to version control.
Using TypeScript Config Path Aliases
If you are using paths
in your tsconfig.json
, support for those aliases can be added to the vite.config.ts
.
First, install the vite-tsconfig-paths
package.
- npm
- Yarn
- pnpm
npm install vite-tsconfig-paths --save-dev
yarn add vite-tsconfig-paths --dev
pnpm install -w vite-tsconfig-paths
Next, add the plugin to the plugins
array in the vite.config.ts
with the root
set as the relative path to the root of the project.
/// <reference types="vitest" />
import { defineConfig } from 'vite';
import angular from '@analogjs/vite-plugin-angular';
import viteTsConfigPaths from 'vite-tsconfig-paths';
export default defineConfig(({ mode }) => ({
plugins: [angular(), viteTsConfigPaths()],
}));