PHPUnit - 调用 1 次时,方法名称的期望失败等于“buildViolation”

问题描述

我是 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 方法。