不够,需按框架装对应插件: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,更轻、更快,也更“原始”。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
实操建议:
- 日常开发推荐用
./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/**无效

















