Laravel PHPUnit测试含多选框的POST请求类型错误问题
问题:Laravel PHPUnit测试多选标签提交时的类型错误
在Laravel中用PHPUnit测试文章创建功能(前端通过name="tags[]"的多选框提交多个标签ID)时,POST请求里的tags参数出现类型错误,无法让Laravel正确识别该值。
前端代码片段(create-article.blade.php)
<!-- tags --> <div class="my-2"> <label for="tags">Tags</label> <select multiple size="5" class="block w-auto py-1 px-2 my-2 appearance-none border border-sky-400 focus:outline-none focus:ring focus:ring-sky-400" name="tags[]" id="tags"> @foreach ($tags as $tag) <option value="{{ $tag->id }}">{{ $tag->title }}</option> @endforeach </select> </div>
测试代码片段(ArticleTest.php)
public function test_create_article_post(): void { $user = User::factory()->accepted()->create(); Storage::fake('test'); $file = UploadedFile::fake()->image('avatar.jpg')->size(100); $tag = Tag::create([ 'title' => 'Health', 'slug' => Str::slug(random_int(1000000000, 9999999999) . 'Health'), 'user_id' => $user->id, ]); $response = $this->actingAs($user) ->post(route('admin.dashboard.create-article'), [ "title" => "Temp Article", "meta_description" => "Just a temporary article.", "description" => "<p>Just some temporary article.</p>", "image" => $file, "tags" => "['$tag->id']", // 问题根源 ]); $response->assertStatus(302); $this->assertDatabaseHas('articles', [ 'title' => 'Temp Article', ]); }
解决方案
1. 修正测试中的tags参数类型
前端多选框name="tags[]"会向服务器提交数组类型的参数,你当前把tags传成了字符串"['$tag->id']",直接导致类型不匹配错误。
将测试代码里的tags参数改为数组形式:
"tags" => [$tag->id],
如果需要测试多选多个标签,直接在数组中添加更多ID即可:
"tags" => [$tag1->id, $tag2->id],
2. 匹配表单验证规则
在处理文章创建的表单请求验证类(或控制器的验证逻辑)中,给tags设置对应数组验证规则,确保Laravel能正确接收并校验参数:
// 示例验证规则 $validated = $request->validate([ // 其他字段规则... 'tags' => 'array|exists:tags,id', // 验证为数组,且每个ID都存在于tags表 'tags.*' => 'integer', // 可选:确保每个元素是整数类型的标签ID ]);
内容的提问来源于stack exchange,提问作者Nay Aung Lin
相关产品推荐
相关产品推荐

