Я пытаюсь выполнить модульное тестирование ограничения, которое имеет зависимость, и эта зависимость (PaymentGateway) имеет другие зависимости. Проблема здесь в том, что метод validate всегда возвращает false, и любое buildViolation вызывается. Любое предложение, как решить эту проблему?
Пока я заменю этот тест на функциональный, расширяющий WebTestCase, чтобы я мог правильно получить CepValidator. Я использую Symfony 3.4.
<?php
namespace Tests\Unit\AppBundle\Validator\Constraints;
use AppBundle\Validator\Constraints\Cep;
use AppBundle\Validator\Constraints\CepValidator;
use Symfony\Component\Validator\Test\ConstraintValidatorTestCase;
class CepValidatorTest extends ConstraintValidatorTestCase
{
protected function createValidator()
{
$pg = $this->getMockBuilder('AppBundle\Utils\PaymentGateway')
->disableOriginalConstructor()
->setMethods(array('getZipCodeInfo'))
->getMock();
return new CepValidator($pg);
}
public function testInvalidCep()
{
$this->validator->validate('22222222', new Cep());
$this->buildViolation('Cep inválido.')->assertRaised();
}
}
Cep Validator
<?php
namespace AppBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use AppBundle\Utils\PaymentGateway;
class CepValidator extends ConstraintValidator
{
protected $paymentGateway;
public function __construct(PaymentGateway $paymentGateway)
{
$this->paymentGateway = $paymentGateway;
}
public function validate($cep, Constraint $constraint)
{
$address = $this->paymentGateway->getZipCodeInfo($cep);
if (!isset($address->city)) {
$this->context->buildViolation($constraint->message)->addViolation();
return false;
}
return true;
}
}