А как тестировать handler?

Здравствуйте. А как тестируют handler?
Есть такой:
public function __construct(
        private CityRepository $cityRepository
    )
    {
    }

    public function __invoke(CommandInterface $command): void
    {
        $city = new City(
            Id::generate(),
            $command->getName(),
            $command->getLocation(),
            new DateTimeImmutable()       
        );
        $this->cityRepository->add($city);
    }

Я хочу проверить, что хендлер записывает в базу значение (или я вообще не должен этого делать и должен проверить только, что как-то срабатывать `__invoke` метод?)
public function setUp(): void
   {
       BypassFinals::enable();
       parent::setUp();
       $this->mock = $this->getMockBuilder(CreateCityHandler::class)
           ->disableOriginalConstructor()
           ->getMock();
   }
   public function testCreate() {
       $this->mock->__invoke(new CreateCityCommand(
           $name = 'Изумрудный город',
           1
       ));
   }

И вопрос, а что я могу проверить? Я не могу проверить, что попало в базу, потому что я не знаю Id, по которому туда попадут значения, хендлер ничего не возвращает void. Как вообще их тестируют?
  • Вопрос задан
  • 137 просмотров
Пригласить эксперта
Ответы на вопрос 2
Если вы пишите Unit-тест - вместо CityRepository используйте мок, который будет проверять что в него пришел именно тот объект который вы ожидаете.
Ответ написан
Комментировать
@HellWalk
Если говорить не о чистых юнит тестах (они замороченные), а функциональном тестировании (на базе того же функционала phpunit), то:

Я не могу проверить, что попало в базу, потому что я не знаю Id, по которому туда попадут значения


Но вы же знаете название добавляемого города - по нему и проверьте, появился ли такой город в базе.

P.S.
У вас там сущности можно оптимизировать - как понимаю вы там каждый раз uuid и дату создания передаете в конструктор, можно сделать трейты раз два, и в сущности указывать:

/**
 * @ORM\Entity(repositoryClass=PostRepository::class)
 * @ORM\HasLifecycleCallbacks()
 */
class Post
{
    use IdTrait;
    use CreatedAtTrait;

   // ...


Двумя строчками в сущности добавляете два поля и их автоматическое заполнение. Избавите конструктор от двух параметров.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы