Как правильно использовать валидатор Symfony в тесте?

1

У меня есть класс обслуживания:

class OutletTableWriter
{
    private $validator;

    private $entityManager;

    public function __construct(ValidatorInterface $validator, EntityManagerInterface $em)
    {
        $this->validator    = $validator;
        $this->em           = $em;

    }
// inserts outlet to db
    public function insertOutlet($outletName, $buildingName = null, $propertyNumber, $streetName, $area, $town, $contactNumber, $postcode)
    {
        $outlet = new Outlet();
        $outlet->setOutletName($outletName);
        $outlet->setBuildingName($buildingName);
        $outlet->setPropertyNumber($propertyNumber);
        $outlet->setStreetName($streetName);
        $outlet->setArea($area);
        $outlet->setTown($town);
        $outlet->setContactNumber($contactNumber);
        $outlet->setPostCode($postcode);
        $outlet->setIsActive(0);

        // $validator = $this->get('validator'); // validate constraints
        $errors = $this->validator->validate($outlet);
        if (count($errors) > 0) {
            $response = new Response('', 422, array('content-type' => 'text/html'));

            $errorsString = (string) $errors;
            $response->setContent($errorsString);
            return $response;
        }

        $this->em->persist($outlet);
        $this->em->flush(); // save

        return new Response('Outlet #'.$outlet->getId().' has been successfully saved.', 201);
    }

Это работает так, как ожидалось. Однако при тестировании функциональности этого класса возникают проблемы. У меня есть следующий метод тестирования:

public function testUnsuccessfulInsertOutlet()
    {
        $mockValidator  = $this->getMockBuilder(ValidatorInterface::class)
            ->disableOriginalConstructor()
            ->getMock();

        $mockEm         = $this->getMockBuilder(EntityManagerInterface::class)
            ->disableOriginalConstructor()->getMock();


        $outletTableWriter  = new OutletTableWriter($mockValidator, $mockEm);
        $response           = $outletTableWriter->insertOutlet(
            '', '', '', '', '', '', 'EXX 1XX'
        );

        $this->assertEquals(422, $response->getStatusCode());
    }

Валидатор должен завершиться неудачей, но похоже, что проверка не выполнена (возвращается ответ 201). Я чувствую, что это как-то связано с тем, как я издеваюсь над классом валидатора (его даже нужно издеваться?) Я попытался передать только объект самого класса, и это привело к следующему исключению: Error: Cannot instantiate interface Symfony\Component\Validator\Validator\ValidatorInterface.

Я использую Symfony 3.4.6.

Цените любые советы.

Теги:
validation
mocking
phpunit

2 ответа

1
Лучший ответ

Я получил валидатор, работающий в тестовом классе на основе этого пользовательского опыта: https://github.com/symfony/symfony-docs/issues/6532

Поэтому в моем тесте я сделал следующие изменения (при создании экземпляра проверки):

use Symfony\Component\Validator\Validation;

$this->validator    = Validation::createValidatorBuilder()->enableAnnotationMapping()->getValidator();
0

Я думаю, вы должны сказать валидатору, что делать, когда вызывается метод "validate". например

    $errors = ['some_error'];
    $validatorMock = $this->createMock(ValidatorInterface::class);
    $validatorMock->expects($this->once())->method('validate')->with($outlet)->willReturn($errors);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню