mcpField
L
laravel-tdd

laravel-tdd

github.com/iserter测试与质量48378 次安装27 周前更新
代码仓库

关于 laravel-tdd

laravel-tdd 是面向 Laravel 应用的测试驱动开发技能,结合 Pest PHP 与 Laravel 测试模式。它指导开发者先编写并验证失败测试,再实现功能并重构。

主要功能

  1. 01RED–GREEN–REFACTOR 循环
  2. 02Pest PHP 与 Laravel 测试模式
  3. 03数据库、授权与 API 测试
  4. 04Laravel 功能验证清单

适用场景

  1. 01以测试优先开发 Laravel 功能
  2. 02测试缺陷修复与 API 端点
  3. 03检查迁移、验证规则和授权

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/iserter/laravel-claude-agents --skill laravel-tdd

安装后在 Claude Code 中输入/laravel-tdd确认已加载。

详细介绍

Laravel 的测试驱动开发

概述

先编写测试。观察测试失败。编写最少的代码使其通过。

此技能针对使用 Pest PHP、Laravel 测试功能和框架特定模式的 Laravel 应用,调整了 TDD 原则。

适用场景

始终适用于 Laravel:

  • 新功能(控制器、模型、服务)
  • Bug 修复
  • API 端点
  • 数据库迁移和模型
  • 表单验证
  • 授权策略
  • 队列任务
  • Artisan 命令
  • 中间件

例外情况(请咨询你的人工伙伴):

  • 一次性原型
  • 配置文件
  • 仅视图的修改(无逻辑)

Laravel TDD 循环

RED → Verify RED → GREEN → Verify GREEN → REFACTOR → Repeat
RED - 编写失败的测试

编写一个最简测试,展示 Laravel 功能应如何运行。

功能测试示例:

<?php

use App\Models\User;
use App\Models\Post;

test('authenticated user can create post', function () {
    $user = User::factory()->create();
    
    $this->actingAs($user)
        ->post('/posts', [
            'title' => 'My First Post',
            'content' => 'Post content here',
        ])
        ->assertRedirect('/posts');
    
    expect(Post::where('title', 'My First Post')->exists())->toBeTrue();
    expect(Post::first()->user_id)->toBe($user->id);
});
验证 RED - 观察测试失败
php artisan test --filter=authenticated_user_can_create_post
GREEN - 编写最少的 Laravel 代码

编写最简单的 Laravel 代码,使测试通过。

验证 GREEN - 观察测试通过
php artisan test
REFACTOR - 清理 Laravel 代码

仅在测试通过后:

  • 为复杂逻辑提取服务
  • 为授权创建策略
  • 添加查询作用域以便复用
  • 使用事件处理副作用

Laravel 特定测试模式

数据库测试
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

test('creates post in database', function () {
    $user = User::factory()->create();
    
    $this->actingAs($user)
        ->post('/posts', ['title' => 'Test', 'content' => 'Content']);
    
    $this->assertDatabaseHas('posts', ['title' => 'Test']);
});
授权测试
test('user cannot delete others posts', function () {
    $user = User::factory()->create();
    $post = Post::factory()->create();
    
    $this->actingAs($user)
        ->delete("/posts/{$post->id}")
        ->assertForbidden();
});
API 测试
test('creates post via API', function () {
    $user = User::factory()->create();
    
    $this->actingAs($user, 'sanctum')
        ->postJson('/api/posts', ['title' => 'API Post', 'content' => 'Content'])
        ->assertCreated();
});

验证清单

  • 迁移测试通过
  • 模型关系已测试
  • 控制器操作已测试
  • 验证规则已测试
  • 授权已测试
  • 数据库状态已验证
  • 所有测试均通过
  • 已使用 RefreshDatabase
  • 已使用工厂

记住

Every Laravel feature → Test exists and failed first
Otherwise → Not TDD

评论

支持 Markdown