В моем проекте 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 Я прочитал десятки примеров, и ничего не помогло решить эту проблему.