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
相关产品推荐
相关产品推荐

