代码之家  ›  专栏  ›  技术社区  ›  Alexey Shabramov

laravel&phpunit-表单请求验证-奇怪的“需要”规则验证问题

  •  0
  • Alexey Shabramov  · 技术社区  · 5 年前

    在我的laravel 5.7项目中,我试图使用phpunit框架验证我的loginrequest类,并且在我的单元测试中遇到了一个奇怪的问题。

    登录请求如下:

    <?php
    
    namespace App\Http\Requests;
    
    use Illuminate\Foundation\Http\FormRequest;
    
    class LoginRequest extends FormRequest
    {
        /**
         * Determine if the user is authorized to make this request.
         *
         * @return bool
         */
        public function authorize()
        {
            return true;
        }
    
        /**
         * Get the validation rules that apply to the request.
         *
         * @return array
         */
        public function rules()
        {
            return [
                'user.identity' => 'required|between:3,254',
                'user.password' => 'required|between:8,36'
            ];
        }
    }
    

    我为登录请求创建了单元测试,以通过以下两种方法检查所有验证规则:

    <?php
    
    namespace Tests\Unit\Requests;
    
    use App\Http\Requests\LoginRequest;
    use Illuminate\Support\Str;
    use Tests\TestCase;
    
    class LoginRequestTest extends TestCase
    {
        use PrepareValidator;
    
        private $loginUserUrl = '/api/users/login';
    
    
        public function setUp()
        {
            parent::setUp();
            $this->validationRules = (new LoginRequest())->rules();
        }
    
        public function testIdentityRule()
        {
            $this->assertTrue(
                $this->validateField('user.identity', 'userlogin')
            );
            $this->assertTrue(
                $this->validateField('user.identity', 'myemail@gmail.com')
            );
            $this->assertFalse(
                $this->validateField('user.identity', '')
            );
            $this->assertFalse(
                $this->validateField('user.identity', 'ut')
            );
            $this->assertFalse(
                $this->validateField('user.identity', str_random(255))
            );
        }
    
        public function testPasswordRule()
        {
            $this->assertTrue(
                $this->validateField('user.password', 'mypasswordqwerty111')
            );
            $this->assertFalse(
                $this->validateField('user.password', 'mobmob')
            );
            $this->assertFalse(
                $this->validateField('user.password', Str::random(37))
            );
        }
    }
    

    为了检查所有的验证规则,我为自己的目的创建了特殊特征 like in this advise

    <?php
    
    
    namespace Tests\Unit\Requests;
    
    
    use Illuminate\Support\Facades\Validator;
    
    trait PrepareValidator
    {
        private $validationRules;
    
        private function getFieldValidator($field, $value)
        {
            return Validator::make(
                [$field => $value],
                [$field => $this->validationRules[$field]]);
        }
    
        private function validateField($field, $value): bool
        {
            return $this->getFieldValidator($field, $value)->passes();
        }
    }
    

    问题:

    loginRequestTest中的每个方法,其中我试图检查 要求 规则-返回 :

    $this->assertTrue(
                $this->validateField('user.identity', 'thisisthecorrectlogin')
            );
    

    …//=>错误

    testPasswordRule()方法中的相同问题:

    $this->assertTrue(
                $this->validateField('user.password', 'thisIsMyPassword')
            );
    

    //=>错误

    所有其他方法都运行良好,接收到的错误信息都是已接受的,并且也有正确的错误消息。

    在调试之后,我收到了来自 验证程序通过方法 对于所有方法,接受 正确登录 正确的密码 我在发出验证时收到此消息:

    <?php
    
    namespace Illuminate\Validation;
    
    ...
    
    class Validator implements ValidatorContract
    {
    
    ...
    /**
     * Determine if the data passes the validation rules.
     *
     * @return bool
     */
    public function passes()
        {
            $this->messages = new MessageBag;
    
            $this->distinctValues = [];
    
            foreach ($this->rules as $attribute => $rules) {
                $attribute = str_replace('\.', '->', $attribute);
    
                foreach ($rules as $rule) {
                    $this->validateAttribute($attribute, $rule);
    
                    if ($this->shouldStopValidating($attribute)) {
                        break;
                    }
                }
            }
    
            foreach ($this->after as $after) {
                call_user_func($after);
            }
            return $this->messages->isEmpty();
        }
    
    ...
    
    }
    

    $this->消息输出-//=>{“user.identity”:[“需要user.identity字段。”]} 要正确登录,必须为空并返回true。

    $this->消息输出-//=>{“user.password”:[“需要user.password字段。”]} 对于正确的密码,也必须为空并返回true。

    你能给点建议吗-我做错什么了?我读过几十个例子,但没有任何帮助解决这个问题。

    0 回复  |  直到 5 年前