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