我正在表单提交中实施新的自定义验证规则。但是我想在单元测试中绕过验证规则。下面是验证规则和单元测试类的简化。我想念什么?
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) {
...
编辑II:似乎是Laravel本身的错误;
尝试了提供的解决方案,但仍然无法正常工作
答案 0 :(得分:2)
必须通过Laravels服务容器实例化该类,以便对其进行模拟。最好的方法(在这种情况下)是将new Captcha
更改为app(Captcha::class)
:
命名空间App \ Http \ Requests;
use Illuminate\Foundation\Http\FormRequest;
use App\Rules\Captcha;
class NewUserRequest extends FormRequest {
public function rules()
{
return [
'name' => ['required', app(Captcha::class)]
];
}
}
我建议您不要告诉规则本身根据环境来更改其行为,因为当您试图弄清验证码在开发环境中什么都不做的时候,这可能会引起混乱。生产失败。
答案 1 :(得分:0)
似乎很长一段时间以来,Laravel中都存在一个错误,因此解决方法是不使用Mock。因此,当存在Rule
环境时,我只会绕过testing
类。
if (app()->environment() === 'testing')
return true;