本文へ移動
cccskills
無料GitHub で公開

developing-with-tdd

Test-Driven Development for backend code. Red-Green-Refactor cycle with practical patterns.

インストール方法を見る

含まれるファイル(1)

  • SKILL.md2.6 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

TDD Cycle

Red → Green → Refactor

  1. Red: Write a failing test that describes desired behavior
  2. Green: Write the minimum code to make it pass (no gold-plating)
  3. Refactor: Improve the code without changing behavior (tests stay green)

Never skip to Green without a failing Red test first.

Practical Rules

Rule 1: One test at a time Write one failing test. Make it pass. Only then write the next test.

Rule 2: Minimum viable production code In Green phase, write only what's needed to pass the test. No future-proofing.

Rule 3: Test behavior, not implementation Bad: expect(user._hash).toBeDefined() Good: expect(await user.verifyPassword('secret')).toBe(true)

Rule 4: Fast tests Unit tests must run in <100ms. Use mocks for I/O (database, network, filesystem).

Structure

src/
  auth/
    auth.service.ts         ← Implementation
    auth.service.test.ts    ← Tests (co-located)

Test Template (TypeScript/Vitest)

import { describe, it, expect, beforeEach, vi } from 'vitest';
import { AuthService } from './auth.service';

describe('AuthService', () => {
  let service: AuthService;

  beforeEach(() => {
    service = new AuthService({ /* mock deps */ });
  });

  describe('login()', () => {
    it('returns a JWT token for valid credentials', async () => {
      // Arrange
      const credentials = { email: 'user@test.com', password: 'correct' };
      // Act
      const result = await service.login(credentials);
      // Assert
      expect(result.token).toMatch(/^eyJ/);
    });

    it('throws for invalid password', async () => {
      await expect(service.login({ email: 'user@test.com', password: 'wrong' }))
        .rejects.toThrow('Invalid credentials');
    });
  });
});

Mocking External Dependencies

// Mock the database
const mockUserRepo = {
  findByEmail: vi.fn().mockResolvedValue({ id: '1', email: 'user@test.com', passwordHash: '$2b...' }),
};

When to Stop TDD

  • Configuration files
  • Simple data transformations (use property-based testing instead)
  • Exploratory code (spike) — delete tests after learning, rewrite properly

Definition of Done

  • All tests pass
  • No test mocks real behavior (only I/O)
  • Coverage ≥ 80% on the changed module
  • Tests run in < 1 second total

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

anoa

無料

Drive a real browser from the command line — open pages, snapshot the interactive elements as refs, click and fill by ref, read text, run JS, screenshot. Use when a task needs a live browser: checking a page renders, walking a login or checkout flow, scraping something that only exists after JavaScript runs, or reproducing a UI bug.

日本語の概要は準備中です。原文の説明を表示しています。

porcupine-md/jonggrang152026年9月15日 更新

Run linters/typecheckers to calculate health score.

日本語の概要は準備中です。原文の説明を表示しています。

porcupine-md/jonggrang152026年9月15日 更新

Comprehensive UI/UX compliance check (A11y, performance, responsive).

日本語の概要は準備中です。原文の説明を表示しています。

porcupine-md/jonggrang152026年9月15日 更新

Infrastructure-first security audit (OWASP, secrets, dependencies).

日本語の概要は準備中です。原文の説明を表示しています。

porcupine-md/jonggrang152026年9月15日 更新

auth

無料

Setup authentication flow (register, login, session/JWT, middleware)

日本語の概要は準備中です。原文の説明を表示しています。

porcupine-md/jonggrang152026年9月15日 更新

Deep knowledge about deploying applications to AWS (EC2, ECS, S3, CloudFront, Cloud Run).

日本語の概要は準備中です。原文の説明を表示しています。

porcupine-md/jonggrang152026年9月15日 更新

porcupine-md のスキルをすべて見る

このスキルの問題を報告する