问题描述
我是 Symfony 4 的新手,我一直在测试验证。
当调用 1 次时,方法名称的期望失败等于 'buildViolation'。 方法预期调用1次,实际调用0次。
我错过了什么?感谢您的帮助!
这是我的验证器的内容
namespace CoreBundle\Validator;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use UserBundle\Service\FilterNameService;
class FilterNameValidator extends ConstraintValidator
{
private FilterNameService $filterNameService;
public function __construct(FilterNameService $filterNameService)
{
$this->filterNameService = $filterNameService;
}
/**
* @param mixed $value The value that should be validated
* @param Constraint $constraint The constraint for the validation
*/
public function validate($value,Constraint $constraint)
{
if ($this->filterNameService->haveForbiddenWord($value)) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ string }}',$value)
->addViolation();
}
}
}
这是我的验证器测试的内容
namespace Tests\CoreBundle\Validator;
use CoreBundle\Validator\FilterName;
use CoreBundle\Validator\FilterNameValidator;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Violation\ConstraintViolationBuilderInterface;
use UserBundle\Service\FilterNameService;
class FilterNameValidatorTest extends KernelTestCase
{
public FilterNameService $filterNameService;
public FilterNameValidator $filterNameValidator;
protected function setUp()
{
self::bootKernel();
$container = self::$kernel->getContainer();
$this->filterNameService = $this->getMockBuilder(FilterNameService::class)
->disableOriginalConstructor()
->getMock();
}
public function testCatchBadNames()
{
$validator = new FilterNameValidator($this->filterNameService);
$violation = $this->getMockBuilder(ConstraintViolationBuilderInterface::class)->getMock();
$violation->expects($this->any())->method('setParameter')->willReturn($violation);
$context = $this->getMockBuilder(ExecutionContextInterface::class)->getMock();
$context
->expects($this->once())
->method('buildViolation');
$validator->initialize($context);
return $validator;
}
}
解决方法
您需要在 validate
方法中调用 testCatchBadNames
方法。