我想为我的自定义规则编写一个测试。
我的示例如下所示。 我正在检查用户输入的当前密码是否正确。
我的自定义规则:
public function passes($attribute, $value)
{
return Hash::check($value, auth()->user()->password);
}
public function message()
{
return 'Your current password is incorrect.';
}
以及该规则的测试:
class CurrentPasswordTest extends TestCase
{
use WithFaker, RefreshDatabase;
/** @test */
public function current_password_must_be_valid()
{
$rule = new CurrentPassword();
$user = factory(User::class)->create(['password' => '1234']);
$this->assertTrue($rule->passes('current_password','1234'), $user->password);
}
}
但我遇到错误:
Tests \ Unit \ CurrentPasswordTest :: current_password_must_be_valid ErrorException:尝试获取非对象的属性“密码”
在此示例中我做错了什么?
答案 0 :(得分:0)
您需要先登录用户,然后才能使用passes()
方法-否则auth()->user()
将为空。您可以使用be($user)
方法来做到这一点:
/** @test */
public function current_password_must_be_valid()
{
$rule = new CurrentPassword();
$user = factory(User::class)->create(['password' => '1234']);
$this->be($user);
$this->assertTrue($rule->passes('current_password','1234'), $user->password);
}
为防止错误,建议您在null
方法中防止passes()
值。如果没有用户登录,则可能应该只返回false
。