如何在 laravel 表单请求上单元测试准备验证?



>背景:在我的Laravel项目中,我正在实现用户创建功能,管理员可以在其中创建用户。在用户创建期间,我设置了一个随机密码(不是输入(并向用户发送密码重置电子邮件。在我的架构上,密码字段不可为空(我不希望数据库中没有任何没有密码的用户(。

我正在使用表单请求来实现控制器验证并准备验证以在开机自检时设置随机密码,但在PATCH上将密码设置为 null,因为我不希望在用户更新事件时更新密码。(管理员可以更新用户配置文件,但不能更新密码。验证规则"有时"处理这两种情况。

下面是我的请求类(规则准备验证方法(。

class AdminUserRequest extends FormRequest
{
public function rules()
{
return [
...
'password' => [
'sometimes',
'required',
'min:8',
],
...
];
}
/**
* Prepare the data for validation.
*
* @return void
*/
protected function prepareForValidation()
{
if ($this->getMethod() == 'POST') {
$this->merge([
'password' => Hash::make(Str::random(10)),
]);
} else {
$this->offsetUnset('password');
}
}
}

问:我的问题是在表单请求中对 prepareForValidation功能进行单元测试的最佳方法是什么。

它应该测试请求数据集是否在 POST 上具有密码,而不是在其他方法上设置。

当然,我可以做功能测试来涵盖这些情况

  • POST to 路由在数据库中创建一个用户,并且在会话中没有错误
  • PATCH 到路由不会更改密码,即使密码在数据集中传递也是如此。

但我想知道是否有办法对此进行单元测试。以及如何做到这一点。

提前致谢

可能是这样的(我没有嘲笑request并安排对它的期望 - 而是保持简单(。最后一个方法是private/protected类的方法调用。这可以移动到类TestCase以供将来使用。

class AdminUserRequestTest extends TestCase
{
/**
* @test
* @covers ::prepareForValidation
*/
function it_should_add_password_when_it_is_post_method()
{
$request = new AdminUserRequest();
$request->setMethod('POST');
$hashedPassword = 'a1b2c3d4e5';
Hash::shouldReceive('make')->andReturn($hashedPassword);
$this->invokeMethod($request, 'prepareForValidation');
$this->assertSame($request->get('password'), $hashedPassword);
}
/**
* @test
* @covers ::prepareForValidation
*/
function it_should_unset_password_when_it_is_not_post_method()
{
$request = new AdminUserRequest();
$request->setMethod('PUT'); // it could be something else besides POST
$this->invokeMethod($request, 'prepareForValidation');
$this->assertFalse($request->has('password'));
}
protected function invokeMethod(&$object, $methodName, array $parameters = [])
{
$reflection = new ReflectionClass(get_class($object));
$method = $reflection->getMethod($methodName);
$method->setAccessible(true);
return $method->invokeArgs($object, $parameters);
}
}

最新更新