Skills Plugins MCP Prompt Model 博客 我的中心

laravel-tdd

使用 PHPUnit 和 Pest、工厂、数据库测试、模拟以及覆盖率目标进行 Laravel 的测试驱动开发。

DeepseekModel キュレーション済みスキル 品質 優秀 · 90 v1.0.0

取得

https://deepseekmodel.com/api/download.php?id=affaan-m-ecc-docs-zh-cn-skills-laravel-tdd-skill-md&format=skill
ダウンロード .skill 標準形式。system_prompt と model_config を収録し、任意の Agent で利用可能
.skill ファイルの system_prompt フィールドの実際の内容。
name laravel-tdd description 使用 PHPUnit 和 Pest、工厂、数据库测试、模拟以及覆盖率目标进行 Laravel 的测试驱动开发。 origin ECC Laravel TDD 工作流 使用 PHPUnit 和 Pest 为 Laravel 应用程序进行测试驱动开发,覆盖率(单元 + 功能)达到 80% 以上。 使用时机 Laravel 中的新功能或端点 错误修复或重构 测试 Eloquent 模型、策略、作业和通知 除非项目已标准化使用 PHPUnit,否则新测试首选 Pest 工作原理 红-绿-重构循环 编写一个失败的测试 实施最小更改以通过测试 在保持测试通过的同时进行重构 测试层级 单元 :纯 PHP 类、值对象、服务 功能 :HTTP 端点、身份验证、验证、策略 集成 :数据库 + 队列 + 外部边界 根据范围选择层级: 对纯业务逻辑和服务使用 单元 测试。 对 HTTP、身份验证、验证和响应结构使用 功能 测试。 当需要验证数据库/队列/外部服务组合时使用 集成 测试。 数据库策略 对于大多数功能/集成测试使用 RefreshDatabase (每次测试运行运行一次迁移,然后在支持时将每个测试包装在事务中;内存数据库可能每次测试重新迁移) 当模式已迁移且仅需要每次测试回滚时使用 DatabaseTransactions 当每次测试都需要完整迁移/刷新且可以承担其开销时使用 DatabaseMigrations 将 RefreshDatabase 作为触及数据库的测试的默认选择:对于支持事务的数据库,它每次测试运行运行一次迁移(通过静态标志)并将每个测试包装在事务中;对于 :memory: SQLite 或不支持事务的连接,它在每次测试前进行迁移。当模式已迁移且仅需要每次测试回滚时使用 DatabaseTransactions 。 测试框架选择 新测试默认使用 Pest (当可用时)。 仅在项目已标准化使用它或需要 PHPUnit 特定工具时使用 PHPUnit 。 示例 PHPUnit 示例 use App \ Models \ User ; use Illuminate \ Foundation \ Testing \ RefreshDatabase ; use Tests \ TestCase ; final class ProjectControllerTest extends TestCase { use RefreshDatabase ; public function test_owner_can_create_project ( ): void { $user = User :: factory ()-> create (); $response = $this -> actingAs ( $user )-> postJson ( '/api/projects' , [ 'name' => 'New Project' , ]); $response -> assertCreated (); $this -> assertDatabaseHas ( 'projects' , [ 'name' => 'New Project' ]); } } 功能测试示例(HTTP 层) use App \ Models \ Project ; use App \ Models \ User ; use Illuminate \ Foundation \ Testing \ RefreshDatabase ; use Tests \ TestCase ; final class ProjectIndexTest extends TestCase { use RefreshDatabase ; public function test_projects_index_returns_paginated_results ( ): void { $user = User :: factory ()-> create (); Project :: factory ()-> count ( 3 )-> for ( $user )-> create (); $response = $this -> actingAs ( $user )-> getJson ( '/api/projects' ); $response -> assertOk (); $response -> assertJsonStructure ([ 'success' , 'data' , 'error' , 'meta' ]); } } Pest 示例 use App \ Models \ User ; use Illuminate \ Foundation \ Testing \ RefreshDatabase ; use function Pest \ Laravel \ actingAs ; use function Pest \ Laravel \ assertDatabaseHas ; uses ( RefreshDatabase :: class ); test ( 'owner can create project' , function () { $user = User :: factory ()-> create (); $response = actingAs ( $user )-> postJson ( '/api/projects' , [ 'name' => 'New Project' , ]); $response -> assertCreated (); assertDatabaseHas ( 'projects' , [ 'name' => 'New Project' ]); }); Pest 功能测试示例(HTTP 层) use App \ Models \ Project ; use App \ Models \ User ; use Illuminate \ Foundation \ Testing \ RefreshDatabase ; use function Pest \ Laravel \ actingAs ; uses ( RefreshDatabase :: class ); test ( 'projects index returns paginated results' , function () { $user = User :: factory ()-> create (); Project :: factory ()-> count ( 3 )-> for ( $user )-> create (); $response = actingAs ( $user )-> getJson ( '/api/projects' ); $response -> assertOk (); $response -> assertJsonStructure ([ 'success' , 'data' , 'error' , 'meta' ]); }); 工厂和状态 使用工厂生成测试数据 为边缘情况定义状态(已归档、管理员、试用) $user = User :: factory ()-> state ([ 'role' => 'admin' ])-> create (); 数据库测试 使用 RefreshDatabase 保持干净状态 保持测试隔离和确定性 优先使用 assertDatabaseHas 而非手动查询 持久性测试示例 use App \ Models \ Project ; use Illuminate \ Foundation \ Testing \ RefreshDatabase ; use Tests \ TestCase ; final class ProjectRepositoryTest extends TestCase { use RefreshDatabase ; public function test_project_can_be_retrieved_by_slug ( ): void { $project = Project :: factory ()-> create ([ 'slug' => 'alpha' ]); $found = Project :: query ()-> where ( 'slug' , 'alpha' )-> firstOrFail (); $this -> assertSame ( $project ->id, $found ->id); } } 副作用模拟 作业使用 Bus::fake() 队列工作使用 Queue::fake() 通知使用 Mail::fake() 和 Notification::fake() 领域事件使用 Event::fake() use Illuminate \ Support \ Facades \ Queue ; Queue :: fake (); dispatch ( new SendOrderConfirmation ( $order ->id)); Queue :: assertPushed ( SendOrderConfirmation :: class ); use Illuminate \ Support \ Facades \ Notification ; Notification :: fake (); $user -> notify ( new InvoiceReady ( $invoice )); Notification :: assertSentTo ( $user , InvoiceReady :: class ); 身份验证测试(Sanctum) use Laravel \ Sanctum \ Sanctum ; Sanctum :: actingAs ( $user ); $response = $this -> getJson ( '/api/projects' ); $response -> assertOk (); HTTP 和外部服务 使用 Http::fake() 隔离外部 API 使用 Http::assertSent() 断言出站负载 覆盖率目标 对单元 + 功能测试强制执行 80% 以上的覆盖率 在 CI 中使用 pcov 或 XDEBUG_MODE=coverage 测试命令 php artisan test vendor/bin/phpunit vendor/bin/pest 测试配置 使用 phpunit.xml 设置 DB_CONNECTION=sqlite 和 DB_DATABASE=:memory: 以进行快速测试 为测试保持独立的环境,以避免触及开发/生产数据 授权测试 use Illuminate \ Support \ Facades \ Gate ; $this -> assertTrue ( Gate :: forUser ( $user )-> allows ( 'update' , $project )); $this -> assertFalse ( Gate :: forUser ( $otherUser )-> allows ( 'update' , $project )); Inertia 功能测试 使用 Inertia.js 时,使用 Inertia 测试辅助函数来断言组件名称和属性。 use App \ Models \ User ; use Inertia \ Testing \ AssertableInertia ; use Illuminate \ Foundation \ Testing \ RefreshDatabase ; use Tests \ TestCase ; final class DashboardInertiaTest extends TestCase { use RefreshDatabase ; public function test_dashboard_inertia_props ( ): void { $user = User :: factory ()-> create (); $response = $this -> actingAs ( $user )-> get ( '/dashboard' ); $response -> assertOk (); $response -> assertInertia (fn (AssertableInertia $page ) => $page -> component ( 'Dashboard' ) -> where ( 'user.id' , $user ->id) -> has ( 'projects' ) ); } } 优先使用 assertInertia 而非原始 JSON 断言,以保持测试与 Inertia 响应一致。
このスキルを起動するキーワード。クリックでコピーできます。

このスキルにはトリガーワードがありません。

ダウンロードした .skill に含まれるフィールド。
フィールド 説明
formatフォーマット識別子(skill/v1)
skill_idスキル固有 ID
nameスキル名
versionバージョン
description説明
categoryカテゴリ(配列)
trigger_wordsトリガーワード
tagsタグ
sourceソース
source_urlソース URL(本ページ)
exported_atエクスポート日時(ダウンロード毎)
system_promptシステムプロンプト本文
model_configモデル設定:provider / model / temperature / max_tokens / top_p
examplesサンプル
install_guide各プラットフォームの導入説明(Coze / Dify / Claude / カスタム)
同じスキルを各プラットフォーム形式で出力できます。
.skill 標準形式。system_prompt と model_config を収録し、任意の Agent で利用可能 ダウンロード
.skillpro 拡張形式。scripts / tools / dependencies / hooks を含む ダウンロード
.json 純粋な JSON 出力。system_prompt とモデル設定のみ ダウンロード
Coze frontmatter 付き Markdown。Coze へのインポート用 ダウンロード
Dify Dify DSL。アプリ作成後にそのままインポート ダウンロード

每日精选 Skill 推荐,免费送到你邮箱

输入邮箱,每天接收一个精选 AI Agent 技能推荐。完全免费,持续更新。

提交后我们会发送一封确认邮件,点击邮件里的链接才会开始收信。

完全免费,取消任意时间。我们不会发送垃圾邮件。