Избегайте использования нового класса внутри метода для тестирования - PullRequest
0 голосов
/ 31 мая 2019

У меня есть простой класс в PHP без внедрения зависимостей.Я хотел бы знать лучшую практику, чтобы избежать использования new History() для проверки его внутри тестов.Так что моя цель - иметь History насмешливый.Это мой код:

class TrelloCycleTime
{
    private $historyCards;

    public function __construct()
    {
        $this->historyCards = [];
    }

    public function getAll()
    {
        $params = 'get params from other parts';
        $this->historyCards = new HistoryCards($params);
    }
}

Один из способов - создать метод setHistoryCards и передать мой historyCards издевательский, но мне это не очень нравится.

Другой способэто может быть фабрика.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

Вы уже упоминали сеттер и фабричный подход.Ниже я попытаюсь объяснить еще один - остерегайтесь, однако, что у меня нулевой опыт работы с PHP, и, таким образом, он может нуждаться в корректировке.Более того, я не говорю, что этот подход лучше, чем использование фабрики - это просто еще одна альтернатива, которая может быть полезна в зависимости от ваших конкретных обстоятельств.

В вашем классе не обращайтесь к historyCards напрямую, ноиспользуя метод получения внутренне.При тестировании вашего класса вы можете создать производный класс, который переопределяет метод получения, чтобы он возвращал не оригинал historyCards, а макет:

class TrelloCycleTime
{
    private $historyCards;

    public function __construct()
    {
        $this->historyCards = [];
    }

    protected function getHistoryCards()
    {
        return $this->historyCards;
    }

    public function soSomethingWithHistoryCards()
    {
        ... do some computations, but don't ever use $this-> historyCards,
        ... but always fetch it via $this->getHistoryCards();
    }
}

В своем тесте вы можете использовать следующий производный класс для тестированияметоды класса TrelloCycleTime.

class TrelloCycleTimeWithMockedHistoryCards extends TrelloCycleTime
{
    public mockedHistoryCards; // public so you can access it easily from your tests.

    public function __construct($mockedHistoryCards)
    {
        $this->historyCards = $mockedHistoryCards;
    }

    protected function getHistoryCards()
    {
        return $this->mockedHistoryCards;
    }
}
0 голосов
/ 31 мая 2019

Очевидный ответ на это просто «использовать фабрику».Что-то вроде (извините за любые ошибки, я не программист PHP ...):

class TrelloCycleTime
{
    private $factory;

    private $historyCards;

    public function __construct($factory)
    {
        $this->factory = $factory;
    }

    public function getAll()
    {
        $params = 'get params from other parts';
        $this->historyCards = $this->factory->construct($params);
    }
}

В рабочем коде factory->construct() возвращает фактический HistoryCards объект, но в модульном тестировании вы можетезаставить его вернуть макет, который делает все что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...