bun-test-mocking — скилл для Claude Code: что делает и как установить
Помогает писать моки и шпионы во встроенном раннере bun:test. Пригодится при изоляции сетевых вызовов и подмене модулей.
npx skills add secondsky/claude-skills --skill bun-test-mocking -a claude-codeЧто делает 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-code2Вручную: положить файлы
~/.claude/skills/bun-test-mocking/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/bun-test-mocking/
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-test-mocking -a codex2Вручную: положить файлы
.agents/skills/bun-test-mocking/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-test-mocking -a cursor2Вручную: положить файлы
.cursor/skills/bun-test-mocking/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install secondsky/claude-skills bun-test-mocking2Вручную: положить файлы
.github/skills/bun-test-mocking/SKILL.md1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-test-mocking -a gemini-cli2Командой платформы
gemini skills install https://github.com/secondsky/claude-skills --path plugins/bun/skills/bun-test-mockingВручную: положить файлы
.devin/skills/bun-test-mocking/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill bun-test-mocking -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в 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