W jaki sposób można przetestować niestandardowy weryfikator urządzenia, ale w * bez dostępu do kontenera * i usługi (a tym samym utworzyć obiekt pośredniczący)?Jednostka testująca niestandardowe ograniczenie sprawdzania poprawności w Symfony 2.1, ale bez dostępu do kontenera?
class ContainsItalianVatinValidator extends ConstraintValidator
{
/**
* @param mixed $value
* @param \Symfony\Component\Validator\Constraint $constraint
*/
public function validate($value, Constraint $constraint)
{
if (!preg_match('/^[0-9]{11}$/', $value, $matches)) {
$this->context->addViolation($constraint->message, array(
'%string%' => $value
));
}
// Compute and check control code
// ...
}
}
W moim przypadku testu wiem, że powinny uzyskać dostęp do ConstraintViolationList
, ale nie wiem jak to zrobić od samego walidator:
class ContainsItalianVatinValidatorTest extends \PHPUnit_Framework_TestCase
{
public function testEmptyItalianVatin()
{
$emptyVatin = '';
$validator = new ContainsItalianVatinValidator();
$constraint = new ContainsItalianVatinConstraint();
// Do the validation
$validator->validate($emptyVatin, $constraint);
// How can a get a violation list and call ->count()?
$violations = /* ... */;
// Assert
$this->assertGreaterThan(0, $violations->count());
}
}
Wyodrębniłbym logikę walidacji do usługi i napisał test jednostkowy dla tej usługi. Wewnątrz klasy sprawdzania poprawności sprawdzasz ograniczenie za pomocą usługi i dodajesz komunikat, jeśli sprawdzanie poprawności nie powiedzie się. Tym samym twoja logika walidacji nie jest powiązana z ramą i jest bardziej odporna na przyszłe zmiany. – fabwu