FormRequest 在 Laravel 中的使用:测试输入验证
2024-04-02 02:18:39
测试 Laravel 中 FormRequest 的使用
引言
在 Laravel 中,FormRequest 是一个强大的工具,用于验证传入请求中的输入数据。通过使用 FormRequest,开发人员可以集中管理验证规则,确保在处理数据之前对数据进行验证。但是,仅仅创建 FormRequest 并不足以确保其在控制器中被使用。本文将介绍如何测试 FormRequest 是否被使用,以确保在控制器中正确执行输入验证。
测试 FormRequest 的使用
Spy 方法
Laravel 提供了 spy()
方法来监视对象方法是否被调用。我们可以使用此方法来监视 FormRequest 的 validated()
方法。此方法会在控制器处理请求时调用,以获取验证后的输入数据。
测试步骤
测试 FormRequest 使用的步骤如下:
- 创建 FormRequest 模拟对象 :在测试类中,创建一个 FormRequest 的模拟对象,以便我们能够对其方法进行监视。
- 使用 spy() 方法 :使用
spy()
方法监视 FormRequest 的validated()
方法。 - 发送请求 :向控制器发送一个请求,模拟用户交互或 API 调用。
- 断言 Spy 方法被调用 :在断言中使用
shouldHaveReceived()
方法来检查spy()
方法是否至少被调用了一次。
示例代码
以下代码示例演示如何测试 FormRequest 是否被使用:
use App\Http\Requests\MyStoreRequest;
use Tests\TestCase;
class MyStoreRequestTest extends TestCase
{
public function test_store_method_uses_validation()
{
$spy = $this->spy(MyStoreRequest::class);
$this->postJson('api/store', ['name' => 'John Doe']);
$spy->shouldHaveReceived('validated')->once();
}
}
解决 Assert Status 错误
在测试中,如果收到 "Argument #1 ($attributes
) must be of type array
, null
given" 错误,则表明没有向 SomeModel::create()
方法传递正确的 $attributes
参数。解决此错误的方法是确保传递一个包含要创建的新模型属性的关联数组。
结论
测试 FormRequest 的使用对于确保在控制器中正确进行输入验证至关重要。通过使用 spy()
方法,我们可以监视 FormRequest 的方法是否被调用,从而验证其在控制器中是否被正确使用。
常见问题解答
1. 我需要为每个 FormRequest 都编写一个测试吗?
最好为每个 FormRequest 编写一个测试,以确保它们在控制器中被正确使用。
2. 我如何测试 FormRequest 中的自定义验证规则?
你可以使用 shouldHaveReceived('validated')->with(['name' => 'John Doe'])
断言传递给 validated()
方法的参数。
3. 如果 FormRequest 的 validated()
方法没有被调用怎么办?
这表明控制器没有使用 FormRequest 进行验证。你需要检查控制器并确保它正确调用了 $this->authorize()
和 $this->validate()
方法。
4. 我可以使用不同的方法来测试 FormRequest 吗?
是的,你还可以使用 assertCount()
和 assertContains()
方法来测试 FormRequest 中验证规则的结果。
5. 如何测试 FormRequest 中的错误消息?
你可以使用 shouldHaveReceived('validated')->withErrors()
断言传递给 validated()
方法的错误消息。