Generate and manage Vitest tests for Angular components, services, and Firebase integrations
Generate comprehensive Vitest tests for the quantified-self Angular application.
| Aspect | Configuration |
|---|---|
| Framework | Vitest v3.x |
| Angular Plugin | @analogjs/vite-plugin-angular |
| Environment | jsdom |
| Coverage | @vitest/coverage-v8 |
# Run all tests
npm test
# Run with coverage
npm run test-coverage
# Run Firestore rules tests (requires emulator)
npm run test:rules
import { TestBed } from '@angular/core/testing';
import { vi, describe, it, expect, beforeEach, afterEach, Mock } from 'vitest';
import { MyService } from './my.service';
// Hoist mocks BEFORE vi.mock() calls
const mocks = vi.hoisted(() => ({
myMockedFn: vi.fn(),
}));
// Mock external modules
vi.mock('@angular/fire/firestore', async (importOriginal) => {
const actual = await importOriginal<typeof import('@angular/fire/firestore')>();
return { ...actual, doc: vi.fn(), docData: vi.fn() };
});
describe('MyService', () => {
let service: MyService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
MyService,
{ provide: SomeDep, useValue: mockDep },
]
});
service = TestBed.inject(MyService);
vi.clearAllMocks();
});
afterEach(() => {
vi.restoreAllMocks();
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { vi, describe, it, expect, beforeEach } from 'vitest';
import { MyComponent } from './my.component';
describe('MyComponent', () => {
let component: MyComponent;
let fixture: ComponentFixture<MyComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [/* required modules */],
declarations: [MyComponent],
providers: [/* mocked services */]
}).compileComponents();
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
vi.mock('@angular/fire/firestore', async (importOriginal) => {
const actual = await importOriginal<typeof import('@angular/fire/firestore')>();
return {
...actual,
doc: vi.fn(),
docData: vi.fn(() => of(mockData)),
collection: vi.fn(),
collectionData: vi.fn(() => of([mockItem])),
deleteDoc: vi.fn().mockResolvedValue(undefined),
setDoc: vi.fn().mockResolvedValue(undefined),
};
});
import { of, throwError } from 'rxjs';
// Success
(someMethod as Mock).mockReturnValue(of(mockData));
// Error
(someMethod as Mock).mockReturnValue(throwError(() => new Error('Test error')));
// Store original before modifying
const originalAPI = globalThis.SomeAPI;
beforeEach(() => {
globalThis.SomeAPI = vi.fn().mockImplementation(() => ({ /* mock */ }));
});
afterEach(() => {
globalThis.SomeAPI = originalAPI;
});
| Jasmine/Karma | Vitest |
|---|---|
jasmine.createSpy() |
vi.fn() |
spyOn(obj, 'method') |
vi.spyOn(obj, 'method') |
and.returnValue() |
.mockReturnValue() |
and.callFake() |
.mockImplementation() |
toHaveBeenCalledWith() |
toHaveBeenCalledWith() ✓ |
jasmine.any(Type) |
expect.any(Type) |
# Generate coverage report
npm run test-coverage
# Output: coverage/index.html
vitest: vi, describe, it, expect, beforeEach, afterEachvi.hoisted() for mock values needed in vi.mock()async (importOriginal) patternvi.clearAllMocks() in beforeEachvi.restoreAllMocks() in afterEachas Mock for .mockReturnValue() calls