Lab 13: Testing with Vitest

Time: 30 minutes | Level: Practitioner | Docker: docker run -it --rm node:20-alpine sh

Vitest with TypeScript: describe/it/expect, typed mocks (vi.fn), spies, async tests, beforeEach/afterEach, coverage.


Step 1: Setup

docker run -it --rm node:20-alpine sh
npm install -g typescript ts-node
mkdir /lab13 && cd /lab13
npm init -y
npm install --save-dev vitest @vitest/coverage-v8
cat > tsconfig.json << 'EOF'
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": true,
    "esModuleInterop": true
  }
}
EOF
cat > vitest.config.ts << 'EOF'
import { defineConfig } from 'vitest/config';
export default defineConfig({
  test: {
    globals: true,
    environment: 'node',
    coverage: { provider: 'v8' },
  },
});
EOF

Step 2: Source Files Under Test


Step 3: Basic Tests


Step 4: Typed Mocks (vi.fn)


Step 5: vi.spyOn and Implementation


Step 6: Async Tests and Timers


Step 7: Package.json & Running Tests


Step 8: Capstone — Full Test Suite

📸 Verified Output:


Summary

API
Purpose

describe(name, fn)

Group related tests

it(name, fn) / test()

Individual test case

expect(val).toBe(x)

Strict equality

expect(val).toEqual(x)

Deep equality

expect(fn).toThrow(msg)

Thrown error

expect(p).resolves.toBe(x)

Promise resolves

expect(p).rejects.toThrow(x)

Promise rejects

vi.fn<Args, Return>()

Typed mock function

vi.mocked(fn).mockResolvedValue(x)

Mock async return

vi.spyOn(obj, 'method')

Spy on real method

it.each([...])

Parameterized tests

beforeEach / afterEach

Setup / teardown

Last updated