К основному содержанию
скилл CX Codex

bun-test-mocking — скилл для Claude Code: что делает и как установить

Помогает писать моки и шпионы во встроенном раннере bun:test. Пригодится при изоляции сетевых вызовов и подмене модулей.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add secondsky/claude-skills --skill bun-test-mocking -a claude-code
Открыть на GitHub

Что делает bun-test-mocking

Скилл учит агента синтаксису заглушек во встроенном тестовом раннере Bun. Внутри собраны шаблоны для создания фиктивных функций через mock(), отслеживания вызовов методов с помощью spyOn() и перехвата импортов через mock.module(). Также включены примеры совместимости со стилем Jest через импорт jest из пакета bun:test.

Инструкции охватывают типичные сценарии: подмену глобального fetch, перехват console.log и мокирование методов сервисных классов. При двойном вызове шпиона Bun вернёт ошибку, поэтому код требует явного вызова spy.mockRestore() для сброса состояния объекта. Агент узнаёт, как читать mock.calls, настраивать одноразовые ответы через mockReturnValueOnce и проверять вызовы утверждениями toHaveBeenCalledWith.

Какие задачи решает

  • изолировать внешние API при помощи подмены fetch
  • заменить реализации сторонних библиотек через mock.module
  • отследить аргументы и количество вызовов методов объекта
  • настроить возвращаемые значения и промисы для тестовых сценариев

Примеры запросов агенту

  • Напиши тест на Bun с моком модуля axios, который возвращает статус 200
  • Сделай шпиона для метода getUser в классе сервиса и проверь его вызовы
  • Замокай глобальный fetch в тесте Bun и очисти шпион после завершения

Как установить bun-test-mocking

1Через Skills CLI (Vercel)

npx skills add secondsky/claude-skills --skill bun-test-mocking -a claude-code

2Вручную: положить файлы

~/.claude/skills/bun-test-mocking/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/bun-test-mocking/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о bun-test-mocking

Как установить bun-test-mocking в Claude Code?

Выполните команду npx skills add secondsky/claude-skills --skill bun-test-mocking -a claude-code. Агент получит доступ к справочнику по мокам для Bun.

Что делает bun-test-mocking?

Он даёт агенту инструкции и готовые паттерны мокирования для встроенного раннера bun:test. Это помогает генерировать шпионы, подменять модули и проверять вызовы функций без ошибок в синтаксисе Bun.

Поддерживает ли скилл синтаксис Jest?

Да. Справочник содержит примеры импорта jest прямо из модуля bun:test, что позволяет использовать привычный jest.fn() вместо mock().

Исходный текст

SKILL.md · MIT
---
name: bun-test-mocking
description: Use for mock functions in Bun tests, spyOn, mock.module, implementations, and test doubles.
metadata:
  version: "1.0.0"
license: MIT
---

# Bun Test Mocking

Bun provides Jest-compatible mocking with `mock()`, `spyOn()`, and module mocking.

## Mock Functions

```typescript
import { test, expect, mock } from "bun:test";

// Create mock function
const fn = mock(() => "original");

test("mock function", () => {
  fn("arg1", "arg2");

  expect(fn).toHaveBeenCalled();
  expect(fn).toHaveBeenCalledTimes(1);
  expect(fn).toHaveBeenCalledWith("arg1", "arg2");
});
```

### jest.fn() Compatibility

```typescript
import { test, expect, jest } from "bun:test";

const fn = jest.fn(() => "value");

test("jest.fn works", () => {
  const result = fn();
  expect(result).toBe("value");
  expect(fn).toHaveBeenCalled();
});
```

## Mock Return Values

```typescript
const fn = mock();

// Return value once
fn.mockReturnValueOnce("first");
fn.mockReturnValueOnce("second");

// Permanent return value
fn.mockReturnValue("default");

// Promise returns
fn.mockResolvedValue("resolved");
fn.mockResolvedValueOnce("once");
fn.mockRejectedValue(new Error("fail"));
fn.mockRejectedValueOnce(new Error("once"));
```

## Mock Implementations

```typescript
const fn = mock();

// Set implementation
fn.mockImplementation((x) => x * 2);

// One-time implementation
fn.mockImplementationOnce((x) => x * 10);

// Chain implementations
fn
  .mockImplementationOnce(() => "first")
  .mockImplementationOnce(() => "second")
  .mockImplementation(() => "default");
```

## Spy on Methods

```typescript
import { test, expect, spyOn } from "bun:test";

const obj = {
  method: () => "original",
};

test("spy on method", () => {
  const spy = spyOn(obj, "method");

  obj.method();

  expect(spy).toHaveBeenCalled();
  expect(obj.method()).toBe("original"); // Still works

  // Override implementation
  spy.mockImplementation(() => "mocked");
  expect(obj.method()).toBe("mocked");

  // Restore
  spy.mockRestore();
  expect(obj.method()).toBe("original");
});
```

## Mock Modules

```typescript
import { test, expect, mock } from "bun:test";

// Mock entire module
mock.module("./utils", () => ({
  add: mock(() => 999),
  subtract: mock(() => 0),
}));

// Now imports use mocked version
import { add } from "./utils";

test("mocked module", () => {
  expect(add(1, 2)).toBe(999);
});
```

### Mock Node Modules

```typescript
mock.module("axios", () => ({
  default: {
    get: mock(() => Promise.resolve({ data: "mocked" })),
    post: mock(() => Promise.resolve({ data: "created" })),
  },
}));
```

### Mock with Factory

```typescript
mock.module("./config", () => {
  return {
    API_URL: "http://test.local",
    DEBUG: true,
  };
});
```

## Mock Assertions

```typescript
const fn = mock();

fn("a", "b");
fn("c", "d");

// Call count
expect(fn).toHaveBeenCalled();
expect(fn).toHaveBeenCalledTimes(2);

// Call arguments
expect(fn).toHaveBeenCalledWith("a", "b");
expect(fn).toHaveBeenLastCalledWith("c", "d");
expect(fn).toHaveBeenNthCalledWith(1, "a", "b");

// Return values
fn.mockReturnValue("result");
fn();
expect(fn).toHaveReturned();
expect(fn).toHaveReturnedWith("result");
expect(fn).toHaveReturnedTimes(1);
```

## Mock Properties

```typescript
const fn = mock(() => "value");

fn("arg1");
fn("arg2");

// Access call info
fn.mock.calls;        // [["arg1"], ["arg2"]]
fn.mock.results;      // [{ type: "return", value: "value" }, ...]
fn.mock.lastCall;     // ["arg2"]

// Clear history
fn.mockClear();       // Clear calls, keep implementation
fn.mockReset();       // Clear calls + implementation
fn.mockRestore();     // Restore original (for spies)
```

## Common Patterns

### Mock Fetch

```typescript
import { test, expect, spyOn } from "bun:test";

test("mock fetch", async () => {
  const spy = spyOn(global, "fetch").mockResolvedValue(
    new Response(JSON.stringify({ data: "mocked" }))
  );

  const response = await fetch("/api/data");
  const json = await response.json();

  expect(json.data).toBe("mocked");
  expect(spy).toHaveBeenCalledWith("/api/data");

  spy.mockRestore();
});
```

### Mock Console

```typescript
test("mock console", () => {
  const spy = spyOn(console, "log");

  console.log("test message");

  expect(spy).toHaveBeenCalledWith("test message");
  spy.mockRestore();
});
```

### Mock Class Methods

```typescript
class UserService {
  async getUser(id: string) {
    // Real implementation
  }
}

test("mock class method", () => {
  const service = new UserService();
  const spy = spyOn(service, "getUser").mockResolvedValue({
    id: "1",
    name: "Test User",
  });

  const user = await service.getUser("1");

  expect(user.name).toBe("Test User");
  expect(spy).toHaveBeenCalledWith("1");
});
```

## Common Errors

| Error | Cause | Fix |
|-------|-------|-----|
| `Cannot spy on undefined` | Property doesn't exist | Check property name |
| `Not a function` | Trying to mock non-function | Use correct mock approach |
| `Already mocked` | Double mocking | Use mockRestore first |
| `Module not found` | Wrong module path | Check path in mock.module |

## When to Load References

Load `references/mock-api.md` when:
- Complete mock/spy API reference
- Advanced mocking patterns

Load `references/module-mocking.md` when:
- Complex module mocking
- Hoisting behavior details

© secondsky · MIT · secondsky/claude-skills

Похожие скиллы

Все скиллы по теме «Тесты и QA» →
improve-codebase-architecture Matt Pocock Скилл ищет архитектурные узкие места в кодовой базе и показывает варианты углубления модулей в HTML-отчёте. Подойдёт для ревью перед рефакторингом. 1 163 035установок design-taste-frontend Leonxlnx Скилл задаёт арт-дирекцию для публичных страниц и рабочих экранов, а затем проверяет результат в браузере по скриншотам. Нужен, когда интерфейс выглядит шаблонным или недоработанным. CX Codex +1 678 700установок tdd Matt Pocock Скилл управляет циклом красный-зелёный в TDD: проверяет, что тесты пишутся до кода, держит их на уровне публичных интерфейсов и не завязывает на внутреннюю структуру. 1 141 062установок skill-creator официальный anthropics Помогает создать новый скилл, доработать существующий и проверить результат через тестовые промпты и оценки. 414 180установок agent-browser vercel-labs Скилл управляет браузером через CLI: открывает страницы, заполняет формы, нажимает кнопки и проверяет веб-приложения. Подходит для задач, где агенту нужно действовать в интерфейсе. CX Codex +1 1 200 000установок prototype Matt Pocock Создаёт временный прототип, чтобы проверить логику, модель состояния или вид интерфейса до работы над основным кодом. 986 201установок

Из того же набора116

oauth-implementation Скилл помогает внедрить OAuth 2.0 и OpenID Connect, настроить авторизационные потоки и устранить ошибки валидации state, PKCE или ротации токенов. CX Codex +1 408установок api-gateway-configuration Скилл помогает настроить маршрутизацию, аутентификацию и лимиты запросов в API-шлюзе микросервисной архитектуры. CX Codex +1 408установок health-check-endpoints Скилл для ИИ-кодинга, который помогает настроить liveness, readiness и startup-пробы, а также проверки зависимостей вроде базы и Redis. CX Codex +1 406установок session-management Скилл для ИИ-кодинга, который помогает собрать вход в аккаунт: JWT-токены, хранение сессий в Redis, обновление токена и настройка cookie. CX Codex +1 408установок bun-test-coverage Скилл для работы с покрытием тестов в Bun: флаг --coverage, отчёты lcov, пороги и запуск в CI. Пригодится, когда тесты уже есть, а процент покрытия надо видеть и держать. CX Codex +1 403установок bun-workers Скилл подсказывает агенту, как запускать Web Workers и worker_threads в Bun: параллельные задачи, пул воркеров, обмен сообщениями. CX Codex +1 402установок dependency-upgrade Помогает обновлять зависимости без риска: настраивает карантин для новых версий, блокирует postinstall-скрипты и ведёт обновления поэтапно. CX Codex +1 404установок nuxt-server Скилл для серверной разработки на Nuxt 4 с Nitro: API-роуты, middleware, базы данных и WebSocket. Пригодится, когда бэкенд живёт внутри Nuxt-проекта. CX Codex +1 401установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой