smithery.ai

bun-testing

Testing guidelines for Bun/TypeScript projects using bun:test framework.

First seen Mar 24, 2026

Installation

$ npx skills add https://smithery.ai

Summary

  • Testing guidelines for Bun/TypeScript projects using bun:test framework.
  • Use when writing tests, creating test files, debugging test failures, setting up mocks, or reviewing test code.
  • Triggers on *.test.ts files, test-related questions, mocking patterns, and coverage discussions.

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from smithery.ai · top by installs.

npx skills add https://smithery.ai

Browse all from smithery.ai

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 3,462 B
  • docs SUMMARY.md 300 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 3 installs

SKILL.md

Bun Testing Skill

Quick Reference

  • Framework: bun:test
  • File pattern: *.test.ts inside tests directories
  • Module mocking: Use ModuleMocker from @/tests (see [patterns](references/mocking-patterns.md))
  • Coverage target: 60–80% (focus on important logic, not 100%)
  • Config: .env.test for test environment variables

Test Utilities (src/tests/)

Before writing custom test helpers, check existing utilities:

  • createTestApp(basePath, route, middleware[]) - Creates test Hono app with error handler, logger, and optional middleware
  • ModuleMocker(import.meta.url) - Module mocking utility (see [mocking patterns](references/mocking-patterns.md))
  • post(app, url, body, headers) - POST request helper
  • get(app, url, headers) - GET request helper
  • doRequest(app, url, method, body, headers) - Generic request helper

Example:

import { createTestApp, post } from '@/__tests__'

const app = createTestApp('/api/v1/auth', signupRoute, [captchaMiddleware()])
const response = await post(app, '/api/v1/auth/signup', {
  email: '[email protected]',
  password: 'SecurePass123!'
})

Test Types

  • Unit tests: Mock all dependencies (repositories, services, APIs)
  • Integration tests: Use real database, mock external APIs only
  • Endpoint tests: Use createTestApp() with mocked services

Test Priorities

  1. Correct scenario(s)
  2. Error handling
  3. Boundary inputs
  4. Failure scenarios

Environment Setup

  • Use .env.test for test-specific variables
  • Bun handles env loading natively — no manual dotenv needed
  • Minimize mocking @/env — only mock for special/invalid configs

Mocking Strategy

  • Mock only business logic dependencies (repositories, external APIs)
  • Use global mocks for shared services (CAPTCHA, email) — don't redefine per test
  • No real database or network calls — all I/O must be mocked
  • Don't mock encapsulated dependencies — mock the public API/wrapper only

Type Safety

  • Minimize any — prefer proper TypeScript types
  • Use type inference when possible
  • Use Partial<T> for mock objects
  • Exception: Use any only for complex mocks where full typing adds unnecessary complexity

Test Structure

Use arrange → act → assert pattern with descriptive test names:

describe('UserService', () => {
  it('should return user when found by email', async () => {
    // Arrange
    const mockUser = { id: 1, email: '[email protected]' }
    mockUserRepo.findByEmail.mockResolvedValue(mockUser)

    // Act
    const result = await userService.findByEmail('[email protected]')

    // Assert
    expect(result).toEqual(mockUser)
  })
})

Mocking Patterns

For detailed mocking patterns including variable ordering, beforeEach setup, and ModuleMocker usage, see [references/mocking-patterns.md](references/mocking-patterns.md).

Cleanup

Always clean up side effects after each test:

afterEach(async () => {
  await moduleMocker.clear() // restore mocked modules
  vi.clearAllMocks() // or mock.mockClear() for individual mocks
})