JastaFly
@JastaFly

PHPunit замокать класс внутри тестируемого класса?

Допустим нам нужно протестировать метод, внутри которого используется метод другого класса который влияет на результат:
<?php

use From\Somewhere\ExternalHandler;

class MyClass
{
    public function testingMethod($arg)
    {
        $externalClass = new ExternalHandler();
        $somethingData = $externalClass->doSomething($arg);
        if($somethingData === 'something') {
            return false;
        }

        return $somethingData;
    }
}

Можно ли в PHPunit замокать метод doSomething() класса ExternalHandler(), чтобы внутри тестируемого метода testingMethod, чтобы он возвращал конкретное значение?
  • Вопрос задан
  • 288 просмотров
Решения вопроса 1
В таком виде как описано в вопросе - замокать ничего не получится.
Необходимо вынести создание экземпляра сторонних классов из тестируемого, и передавать их в качестве зависимостей в конструктор. Тогда их можно будет замокать.

<?php

use From\Somewhere\ExternalHandler;

class MyClass
{
    public function _construct(
        private readonly ExternalHandler $handler
    ) {
    }

    public function testingMethod($arg)
    {
        $somethingData = $this->handler->doSomething($arg);
        if($somethingData === 'something') {
            return false;
        }

        return $somethingData;
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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