模拟Laravel自定义验证规则类不起作用

时间:2020-01-22 05:36:57

标签: laravel-5 phpunit

我正在表单提交中实施新的自定义验证规则。但是我想在单元测试中绕过验证规则。下面是验证规则和单元测试类的简化。我想念什么?

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());
     }
} 

编辑:还包括FormRequestController文件

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本身的错误;

尝试了提供的解决方案,但仍然无法正常工作

2 个答案:

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