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

Имею класс обслуживания:

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.

Ценю любой совет.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
716
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

    $errors = ['some_error'];
    $validatorMock = $this->createMock(ValidatorInterface::class);
    $validatorMock->expects($this->once())->method('validate')->with($outlet)->willReturn($errors);
Ответ принят как подходящий

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

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

use Symfony\Component\Validator\Validation;

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

Другие вопросы по теме