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

sul*_*man 1 phpunit laravel-5

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

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.';
    }
}
Run Code Online (Sandbox Code Playgroud)
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());
     }
} 
Run Code Online (Sandbox Code Playgroud)

编辑:包括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]
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)
...

public function postRegister(NewUserRequest $request) {

...
Run Code Online (Sandbox Code Playgroud)

编辑二:看起来像是 Laravel 本身的一个错误;

尝试了提供的解决方案但仍然不起作用

小智 6

该类必须通过 Laravel 服务容器实例化才能被模拟。实现此目的的最佳方法(在这种情况下)是简单地更改new Captchaapp(Captcha::class)

namespace 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)]
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

我建议不要告诉规则本身根据环境改变其行为,因为当您试图弄清楚为什么验证码在开发环境中不执行任何操作但在生产环境中失败时,这可能会导致一些混乱。