当前位置:首页 > AI技术 > 正文内容

Laravel 单元测试中为更新操作传递参数的正确方法完全指南|Duuu笔记

admin6个月前 (04-01)AI技术149

在 Laravel 单元测试中调用 PUT 请求更新资源时,需通过请求体(JSON 或表单数据)传递待修改字段,而非拼接在 URL 中;本文详解如何在 TestCase 中构造含参数的 HTTP 请求,并结合数据提供器实现多场景覆盖测试。

在 laravel 单元测试中调用 `put` 请求更新资源时,需通过请求体(json 或表单数据)传递待修改字段,而非拼接在 url 中;本文详解如何在 `testcase` 中构造含参数的 http 请求,并结合数据提供器实现多场景覆盖测试。

在 Laravel 的 API 测试中,$this->put() 方法用于模拟 HTTP PUT 请求,其

第二个参数即为请求体(payload)

,用于向控制器传递更新所需的数据。你当前的测试代码:

$response = $this->put('api/constituencies/'.$constituency_id);

未传入任何数据,因此控制器中的 $request->name 为空,导致更新无效——这正是测试“看似通过”实则未验证业务逻辑的根本原因。

✅ 正确做法:通过 payload 传递更新参数

假设你的路由已正确定义(推荐使用命名路由):

// routes/api.php

Route::put('/constituencies/{constituency}', [ConstituencyController::class, 'update'])

->name('api.constituencies.update');

则测试应明确构造包含 name 字段的数组作为 payload:

白瓜AI

白瓜AI,一个免费图文AI创作工具,支持 AI 仿写,图文生成,敏感词检测,图片去水印等等。

下载

public function test_a_constituency_can_be_modified()

{

// Arrange

$constituency = Constituency::factory()->create(['name' => 'Old Name']);

// Act: 传递新名称到请求体

$response = $this->put(

route('api.constituencies.update', $constituency),

['name' => 'New Name'] // ← 关键:更新参数在此处

);

// Assert: 验证数据库已变更

$this->assertDatabaseHas('constituencies', [

'id' => $constituency->id,

'name' => 'New Name', // ← 检查是否更新成功

]);

// 可选:验证响应结构与状态

$response->assertStatus(200)

->assertJson(['name' => 'New Name']);

}

?

提示

:使用 route() 辅助函数替代硬编码 URL,既提升可维护性,又自动支持路由模型绑定(如 Constituency $constituency),避免手动解析 ID。

? 进阶技巧:使用 Data Provider 实现多值批量测试

当需验证不同名称、空值、特殊字符等多组输入时,PHPUnit 的 @dataProvider 是最佳实践。它将测试逻辑与数据分离,增强可读性与覆盖率:

/**

* @test

* @dataProvider validConstituencyNamesProvider

*/

public function it_updates_constituency_name_with_various_inputs(string $newName)

{

$constituency = Constituency::factory()->create();

$response = $this->put(

route('api.constituencies.update', $constituency),

['name' => $newName]

);

$response->assertOk()

->assertJson(['name' => $newName]);

$this->assertDatabaseHas('constituencies', [

'id' => $constituency->id,

'name' => $newName,

]);

}

public function validConstituencyNamesProvider(): array

{

return [

['Northshire'],

['St. Elmo\'s Bay'], // 含撇号

['West 12th District'], // 含数字与空格

['Élysée'], // 含重音字符

];

}

⚠️ 注意事项与最佳实践

不要直接使用 $request->all() 在生产代码中更新模型

当前示例为简化演示使用了 $constituency->update($request->all()),但实际项目中

必须显式指定可填充字段或使用表单请求验证

(如 StoreConstituencyRequest),防止 Mass Assignment 漏洞。

控制器应校验输入

建议在 update 方法中引入验证逻辑:

public function update(Request $request, Constituency $constituency)

{

$validated = $request->validate(['name' => 'required|string|max:255']);

$constituency->update($validated);

return new ConstituencyResource($constituency);

}

测试失败场景

补充验证非法输入(如空 name)是否返回 422 错误:

$this->put(route('api.constituencies.update', $constituency), ['name' => ''])

->assertStatus(422);

数据库事务隔离

确保测试类使用 RefreshDatabase trait,保证每次测试运行在干净数据库状态下。

通过以上方式,你不仅能准确传递更新参数,还能构建健壮、可维护、高覆盖的 Laravel CRUD 测试套件。记住:

真正的测试不是“调用接口”,而是“驱动行为并断言结果”

相关文章

【深度学习】Java DL4J 2024年度技术总结

一、Java DL4J深度学习概述 1.1 DL4J框架简介 1.2 与其他深度学习框架的比较 1.3 DL4J 的优势 1.3.1 与 Java 生态系统的无...

深入理解优化:如何利用 Gemini 3.1 的阶梯计费策略?企业级大规模调用实务完全指南|Duuu笔记

需深入理解Gemini 3.1阶梯计费与调用联动关系,通过识别阶梯区间、请求级Token预估截断、多模型路由调度、响应缓存去重、项目拆分配额绑定五种路径优化成本。 ☞☞☞AI 智能聊天, 问答助手,...

前端开发实战详解:骡子快跑怎么注册账号 骡子快跑账号注册流程最佳实践|Duuu笔记

骡子快跑注册仅需1分钟,但激活码需从Discord指定频道获取,输错3次将锁账户24小时;积分与注册邮箱强绑定且不可更换;部分地区即使注册成功也无法运行Agent。 ☞☞☞AI 智能聊天, 问答助手...

bp神经网络是什么网络,神经网络和bp神经网络

1、前馈神经网络:一种最简单的神经网络,各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层.各层间没有反馈。 2、BP神经网络:是一种按照误差逆向传播...

前端开发高级应用:Minimax视频生成提示词中文还是英文好实战案例|Duuu笔记

优先使用英文提示词,因其更契合模型训练语料并能稳定触发视觉特征;其次可采用中英混合策略兼顾文化专有名词;纯中文适用于强本土化场景;最终需通过多指标对比验证最优语言形式。 ☞☞☞AI 智能聊天, 问答...

前端开发实战详解:骡子快跑如何生成会议纪要 骡子快跑语音转文字整理技巧最佳实践|Duuu笔记

使用听脑AI转写、骡子快跑生成纪要、影子跟读校验、自定义术语词典及EcomGPT-CNN情绪风险分析,五步实现会议纪要高效精准产出。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。