如何在Laravel 5.8中测试自定义验证规则

时间:2019-03-30 23:00:08

标签: laravel tdd

我想为我的自定义规则编写一个测试。

我的示例如下所示。 我正在检查用户输入的当前密码是否正确。

我的自定义规则:

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:尝试获取非对象的属性“密码”

在此示例中我做错了什么?

1 个答案:

答案 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