我的目标是构建自定义验证器并使用PHPUnit对其进行测试。
PasswordComplexity.php
<?php
namespace App\Components\Validator\Constraint;
use Symfony\Component\Validator\Constraints\Regex;
/**
* Class Password
* @package App\Components\Validator\Constraint
* @Annotation
*/
class PasswordComplexity extends Regex
{
public $message = 'The password "{{string}}" does not meet the password policy requirements.';
public $pattern = [
'/.{8,}/',
'/\d+/',
'/[a-z]+/',
'/[A-Z]+/',
'/[!@#$%\-_*+=]+/'
];
/**
* {@inheritdoc}
*/
public function getRequiredOptions()
{
return [];
}
}
PasswordComplexityValidator.php
<?php
declare(strict_types=1);
namespace App\Components\Validator\Constraint;
use Symfony\Component\Validator\Constraints\RegexValidator;
class PasswordComplexityValidator extends RegexValidator
{
}
PasswordComplexityValidatorTest.php
<?php
declare(strict_types=1);
namespace App\Tests\Components\Validator\Constraint;
use App\Components\Validator\Constraint\PasswordComplexity;
use App\Components\Validator\Constraint\PasswordComplexityValidator;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Context\ExecutionContext;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Violation\ConstraintViolationBuilderInterface;
class PasswordComplexityValidatorTest extends TestCase
{
public function testRequiredOptions()
{
$validator = new PasswordComplexity();
$this->assertEquals([], $validator->getRequiredOptions());
}
/**
* @dataProvider validPasswordProvider
*/
public function testValidation($value)
{
$constraint = new PasswordComplexity();
/** @var ExecutionContextInterface|MockObject $context */
$context = $this->getMockExecutionContext();
$context->expects($this->never())->method('buildViolation');
$validator = new PasswordComplexityValidator();
$validator->initialize($context);
$validator->validate($value, $constraint);
}
/**
* @dataProvider invalidPasswordProvider
*/
public function testValidationFail($value)
{
$constraint = new PasswordComplexity();
/** @var ExecutionContextInterface|MockObject $context */
$context = $this->getMockExecutionContext();
$context->expects($this->once())
->method('buildViolation')
->with($constraint->message)
->willReturn($this->getMockConstraintViolationBuilder());
$validator = new PasswordComplexityValidator();
$validator->initialize($context);
$validator->validate($value, $constraint);
}
public function validPasswordProvider()
{
return [
['jXb8p$cn'],
['!MC6NcuS'],
['!3%Sy6iF'],
['XyiWmw2#'],
['r@5e#hSY'],
];
}
public function invalidPasswordProvider()
{
return [ // conditions not meet:
['YQ(GJ)&'], // at least 8 characters
['LuAqA=uX'], // at least 1 digit (0 to 9)
['{OG>:@I1'], // at least 1 small case letter
[']su-(+\a'], // at least 1 upper case letter
['CJuCyAGc'], // at least 1 special character
];
}
private function getMockExecutionContext()
{
$context = $this->getMockBuilder(ExecutionContext::class)
->disableOriginalConstructor()
->getMock();
return $context;
}
private function getMockConstraintViolationBuilder()
{
$constraintViolationBuilder = $this->getMockBuilder(ConstraintViolationBuilderInterface::class)->getMock();
$constraintViolationBuilder
->method('setParameter')
->willReturn($constraintViolationBuilder);
$constraintViolationBuilder
->method('setCode')
->willReturn($constraintViolationBuilder);
$constraintViolationBuilder
->method('addViolation');
return $constraintViolationBuilder;
}
我有如下错误:
下面是10个错误:
具有数据集#0 ('jXb8p$cn')的
\Tests\Components\Validator\Constraint\PasswordComplexityValidatorTest::testValidation preg_match()要求参数1是字符串,给定的数组
我不知道如何将数组样本传递给验证器。
https://stackoverflow.com/questions/51179377
复制相似问题