# Vitest Setup and Migration Guide ## Vitest vs Jasmine Comparison | Feature | Vitest | Jasmine/Karma | | ---------- | ----------------------- | --------------------- | | Speed | Faster (native ESM) | Slower | | Watch mode | Instant feedback | Slower rebuilds | | Mocking | `vi.fn()`, `vi.mock()` | `jasmine.createSpy()` | | Assertions | `expect()` (Chai-style) | `expect()` (Jasmine) | | UI | Built-in UI mode | Karma browser | | Config | `angular.json` | `karma.conf.js` | ## Migration from Jasmine to Vitest ### Spy Migration ```typescript // Jasmine const spy = jasmine.createSpy('callback'); spy.and.returnValue('value'); expect(spy).toHaveBeenCalledWith('arg'); // Vitest const spy = vi.fn(); spy.mockReturnValue('value'); expect(spy).toHaveBeenCalledWith('arg'); ``` ### SpyOn Migration ```typescript // Jasmine spyOn(service, 'method').and.returnValue(of(data)); // Vitest vi.spyOn(service, 'method').mockReturnValue(of(data)); ``` ### createSpyObj Migration ```typescript // Jasmine const mockService = jasmine.createSpyObj('UserService', ['getUser', 'updateUser']); mockService.getUser.and.returnValue(of({ id: '1', name: 'Test' })); // Vitest const mockService = { getUser: vi.fn(), updateUser: vi.fn(), }; mockService.getUser.mockReturnValue(of({ id: '1', name: 'Test' })); ``` ### Async Testing Migration ```typescript // Jasmine - using done callback it('should load data', (done) => { service.loadData().subscribe((data) => { expect(data).toBeDefined(); done(); }); }); // Vitest - using async/await it('should load data', async () => { const data = await firstValueFrom(service.loadData()); expect(data).toBeDefined(); }); ``` ### Clock/Timer Migration ```typescript // Jasmine jasmine.clock().install(); jasmine.clock().tick(1000); jasmine.clock().uninstall(); // Vitest vi.useFakeTimers(); vi.advanceTimersByTime(1000); vi.useRealTimers(); ``` ## Vitest Configuration Details ### Full angular.json Configuration ```json { "projects": { "your-app": { "architect": { "test": { "builder": "@angular/build:unit-test", "options": { "tsConfig": "tsconfig.spec.json", "buildTarget": "your-app:build" } } } } } } ``` ### tsconfig.spec.json ```json { "extends": "./tsconfig.json", "compilerOptions": { "types": ["vitest/globals"] }, "include": ["src/**/*.spec.ts"] } ``` ### Optional vite.config.ts For advanced configuration, create a `vite.config.ts`: ```typescript import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { globals: true, environment: 'jsdom', include: ['src/**/*.spec.ts'], coverage: { provider: 'v8', reporter: ['text', 'html', 'lcov'], exclude: ['node_modules/', 'src/test-setup.ts', '**/*.spec.ts', '**/*.d.ts'], }, }, }); ``` ## Running Vitest ```bash # Run tests ng test # Watch mode ng test --watch # Coverage ng test --code-coverage # Run specific file pattern ng test --include='**/user*.spec.ts' # CI mode (single run) ng test --watch=false ```