不够,需按框架装对应插件:laravel 项目须装 pestphp/pest-plugin-laravel,wordpress 项目用 dingo-d/wp-pest-integration-test-setup;testcase.php 不可删除,tests/pest.php 需含 uses(tests\testcase::class);http::fake() 仅拦截 illuminate\support\facades\http 请求。

直接装 pestphp/pest 就够了吗?
不够。Pest 本身只是 PHPUnit 的语法糖层,不带 Laravel 或 WordPress 等框架的测试支持能力——你装完 pestphp/pest 后,get()、actingAs()、RefreshDatabase 全都用不了,会报 Call to undefined method get() 这类错误。
实操建议:
- 如果是 Laravel 项目,必须同时装插件:
composer require --dev pestphp/pest pestphp/pest-plugin-laravel - Laravel 10+ 虽预置了
php artisan pest:install命令,但插件仍需手动加,否则tests/Pest.php里不会自动注入uses(Tests\TestCase::class) - WordPress 主题/插件项目则要用专用集成包:
composer require dingo-d/wp-pest-integration-test-setup --dev,再跑vendor/bin/wp-pest setup theme
为什么 ./vendor/bin/pest 报错“Class not found”?
常见现象:安装完、初始化完,一跑就提示找不到 Tests\TestCase 或 Pest\Test。根本原因不是 Pest 没装好,而是 tests/TestCase.php 被误删或未被正确加载。
实操建议:
-
php artisan pest:install会备份原tests/TestCase.php为TestCase.php.backup,但不会删它——你得留着原文件,Pest 才能通过uses(Tests\TestCase::class)继承它的数据库事务、HTTP 工具、认证上下文 - 检查
tests/Pest.php是否包含这行:uses(Tests\TestCase::class)->in('Feature', 'Unit');;如果手动建了tests/Integration目录,得显式加进去,否则那些目录下的测试完全没 Laravel 上下文 - 别用
it()写在tests/Unit外却忘了补->in(),这是最隐蔽的“测试静默失效”来源
php artisan test 和 ./vendor/bin/pest 有啥区别?
本质一样,都是调 Pest 执行器,但行为细节不同:前者走 Laravel 的命令生命周期(会加载配置、触发事件),后者是纯 Pest CLI,更轻、更快,也更“原始”。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
实操建议:
- 日常开发推荐用
./vendor/bin/pest,响应快,支持--watch(需额外装pestphp/pest-plugin-watch) - CI/CD 环境或需要 Laravel 完整环境时(比如测试 Artisan 命令),用
php artisan test更稳妥 - 两者默认读的都是
phpunit.xml,但php artisan test会额外合并phpunit.xml.dist和 Laravel 的phpunit.xml合并逻辑,容易因配置覆盖导致行为不一致
装了插件但 Http::fake() 不生效?
常见现象:写了 Http::fake(['https://api.example.com/*' => Http::response(['ok' => true])]);,可被测代码发出去的请求还是真连网络,甚至触发了真实 webhook。
原因很具体:Laravel 的 Http::fake() 只拦截通过 Illuminate\Support\Facades\Http 发出的请求;如果你用了 new GuzzleHttp\Client()、file_get_contents() 或第三方 SDK(如 Stripe PHP),它完全不接管。
实操建议:
- 优先改被测代码,统一走
Http::post()等门面方法 - 实在绕不开底层客户端,改用
Http::preventStrayRequests()+Http::fake()组合,强制所有未 fake 的 HTTP 请求抛异常,避免漏测 - 注意路径通配符写法:
https://api.example.com/v1/*有效,https://api.example.com/v1/**无效










