【发布时间】:2020-05-08 05:31:46
【问题描述】:
我正在表单提交中实施新的自定义验证规则。但我想绕过单元测试中的验证规则。下面是验证规则和单元测试类的简化。我错过了什么?
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Captcha implements Rule
{
public function passes($attribute, $value)
{
// assuming will always return false in testing
// works fine when true
return false;
}
public function message()
{
return 'Captcha error! Try again later or contact site admin.';
}
}
use Tests\TestCase;
use App\Rules\Captcha;
class RegistrationTest extends TestCase {
public test_user_registration()
{
$this->mock(Captcha::class, function ($mock) {
$mock->shouldReceive('passes')->andReturn(true);
});
$response = $this->post(route('tenant.register'), [
'g-recaptcha-response' => 1,
'email' => 'user@example.com',
'password' => 'secret',
]);
$this->assertEquals(1, User::all()->count());
}
}
编辑:还包括 FormRequest 和 Controller 文件
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use App\Rules\Captcha;
class NewUserRequest extends FormRequest {
public function rules()
{
return [
'name' => ['required', new Captcha]
];
}
}
...
public function postRegister(NewUserRequest $request) {
...
EDIT II:似乎是 Laravel 本身的一个错误;
- https://github.com/laravel/framework/issues/28468
- https://github.com/laravel/framework/issues/19450
- https://github.com/laravel/framework/issues/25041
尝试了提供的解决方案,但仍然无法正常工作
【问题讨论】:
-
您的代码将模拟实例注册到容器中(通过
->mock()隐式注册)。您是否也从容器中检索它?app(Captcha::class)在您的代码中?如果您不这样做,而只是执行new Captcha,那么它将无法正常工作。 laravel.com/docs/6.x/validation#using-rule-objects 的文档给出了这个例子,这样就不能模拟了。