我最近将HaveIBeenPwned添加到了表单请求类中,以检查破解的密码。鉴于这可以进行外部API调用,在测试过程中我是否可以完全跳过此验证规则或FormRequest类?
这是我在测试中提出的要求。
$params = [
'first_name' => $this->faker->firstName(),
'last_name' => $this->faker->lastName(),
'email' => $email,
'password' => '$password',
'password_confirmation' => '$password',
'terms' => true,
'invitation' => $invitation->token
];
$response = $this->json('POST', '/register-invited', $params);
我正在测试的功能驻留在控制器上。在我的测试中,我使用以下规则发布了通过FormRequest传递的数据数组。
public function rules()
{
return [
'first_name' => 'required|string|max:70',
'last_name' => 'required|string|max:70',
'email' =>
'required|email|unique:users,email|max:255|exists:invitations,email',
'password' => 'required|string|min:8|pwned|confirmed',
'is_trial_user' => 'nullable|boolean',
'terms' => 'required|boolean|accepted',
];
}
我想覆盖密码上的“ pwned”规则,这样我就可以直接进入控制器而不必担心通过验证。
答案 0 :(得分:3)
根据提供的信息,我想说您正在执行一个集成测试,该测试将执行实际的Web请求。在这种情况下,我想说您的测试套件可以连接到第三方,因为这是“集成”的一部分。
如果您仍然更喜欢模拟验证规则,则可以使用swap
来swap out the Validator
$mock = Mockery::mock(Validator::class);
$mock->shouldReceive('some-method')->andReturn('some-result');
Validator::swap($mock);
或通过替换其实例在服务容器中
$mock = Mockery::mock(Validator::class);
$mock->shouldReceive('some-method')->andReturn('some-result');
App:bind($mock);
或者,您可以模拟Cache :: remember()调用,该调用是Pwned validation rule itself的一个内部部分。会导致类似
Cache::shouldReceive('remember')
->once()
->andReturn(new \Illuminate\Support\Collection([]));