You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:33:16