如何将Laravel Pest测试中的闭包函数转为普通函数?
Laravel Pest 提取测试函数后无法使用$this的解决方案
方案1:让提取函数返回闭包
将测试逻辑封装在闭包里返回,闭包内可直接访问测试上下文的$this:
function getLatestSubscription() { return function () { $user = $this->create(User::class); $subscription = $user->newSubscription('default', 'price_id')->create(); $latest = $user->latestSubscription(); $this->assertEquals($subscription->id, $latest->id); }; } // 调用方式 test('can get subscribers latest subscription', getLatestSubscription());
方案2:将测试实例作为参数传入
把$this(测试实例)作为参数传递给提取的函数,在函数内通过参数调用测试方法:
function getLatestSubscription($test) { $user = $test->create(User::class); $subscription = $user->newSubscription('default', 'price_id')->create(); $latest = $user->latestSubscription(); $test->assertEquals($subscription->id, $latest->id); } // 调用时传入$this test('can get subscribers latest subscription', function () { getLatestSubscription($this); });
方案3:利用Pest的uses()绑定上下文
如果多个提取函数需要共享测试环境,可通过uses()声明上下文,让函数直接访问$this:
function getLatestSubscription() { $user = $this->create(User::class); $subscription = $user->newSubscription('default', 'price_id')->create(); $latest = $user->latestSubscription(); $this->assertEquals($subscription->id, $latest->id); } // 在测试文件顶部绑定上下文 uses()->in(__FILE__); // 直接调用函数 test('can get subscribers latest subscription', getLatestSubscription());
优化建议
- 可将这些提取的测试函数放在单独的辅助文件(如
tests/Support/SubscriptionTestHelpers.php),然后在tests/Pest.php中自动加载,避免主测试文件臃肿。 - 保持函数名与测试逻辑强关联,确保测试文件的可读性。
内容的提问来源于stack exchange,提问作者Blakey UK
相关产品推荐
相关产品推荐

