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

Laravel单元测试出现InvalidArgumentException问题求助

解决Laravel单元测试中InvalidArgumentException(请求1条但只有0条可用)的问题

嘿,我一眼就瞅出问题啦!你碰到的这个错误,根源在你的PostFactory里——当你生成测试用的Post时,代码里写了User::all()->random()->id,但测试运行的时候,你的测试数据库里根本没有任何User记录,空集合调用random()可不就报错了嘛!

下面给你两种简单的解决办法,挑顺手的用就行:

办法一:测试时先手动创建User

直接在测试方法里先造个User,再让Post关联它:

public function testCanViewAllPosts()
{
    // 先搞个用户出来
    $user = factory(User::class)->create();
    // 让Post绑定这个用户的ID
    $post = factory(Post::class)->create(['user_id' => $user->id]);
    
    // 后面的请求和断言不变
    $response = $this->get('/posts');
    
    $response->assertStatus(200);
    $response->assertSee($post->body);
    $response->assertSee(str_limit($post->body));
}

办法二:优化工厂,自动生成关联User

更省心的方式是让Post工厂自己搞定User关联,以后每次造Post都不用管User的事儿:

$factory->define(Post::class, function (Faker $faker) {
    return [
        'body' => $faker->text,
        // 用factory直接生成User并关联,不用从空集合里硬捞
        'user_id' => factory(User::class),
        'created_at' => now(),
        'updated_at' => now(),
    ];
});

这样你原来的测试代码不用改,直接运行就能正常工作——Laravel会自动帮你创建对应的User并绑定到Post上。

额外小建议

如果你的Post模型和User模型已经定义了关联关系(比如Post属于User),还可以这么写测试,更贴合Laravel的关联逻辑:

$user = factory(User::class)->create();
$post = $user->posts()->create(factory(Post::class)->raw());

内容的提问来源于stack exchange,提问作者Danny Younes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:00:23