Laravel & PHPunit - проверка запроса формы - странная проблема с проверкой правила require - PullRequest
0 голосов
/ 27 января 2019

В моем проекте Laravel 5.7 я пытаюсь проверить свой класс LoginRequest с помощью phpunit-framework и у меня возникает странная проблема в моем модульном тесте.

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

Чтобы проверить все правила проверки, я создал специальную черту для своих целей какв этом сообщении

<?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, где я пытаюсь проверить правильное значение для require rule - возвращает false :

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

... // => false

И та же проблема в методе testPasswordRule ():

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

// => false

Все остальные методы работали нормально и получили ложное значение как принятое, а также были правильные сообщения об ошибках.

И после отладки яполучили правильные сообщения от Метод проверки Validator для всех методов примите правильный логин и правильный пароль Я получил это сообщение при отправке их проверки:

<?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-> messagesвыходные данные - //=>‹"user.identity":["Поле user.identity обязательно для заполнения. "]} для правильного входа в систему должно быть пустым и возвращать true.

$ this-> output messages - //=>""user.password":["Не требуется заполнить поле user.password. "]} для правильного пароля, также должно быть пустым и возвращать true.

Можете ли вы дать совет - что я делаю не так?PS Я прочитал десятки примеров, и ничего не помогло решить эту проблему.

...