Выполнение модульного тестирования с вложенными зависимостями и классами Factory

Я новичок в модульном тестировании и PHPUnit, но в последнее время я много читал о шаблонах проектирования и изолированных тестах, и я решил реорганизовать приложение, над которым я работаю, чтобы избавиться от статических классов, синглетонов, жестко-закодированных зависимостей и что-нибудь еще определенное в глобальной области видимости, возможно, сделав его "тестируемым" и не боль в заднице для поддержания в будущем, так как он предназначен для долгосрочного проекта.

До сих пор я полагаю, что понимаю теорию модульного тестирования, но мне было интересно, в сценарии, когда один делегат обрабатывает вложенные зависимости объектов на фабрике, как следует выполнять модульное тестирование на упомянутой фабрике или это просто избыточно для тестирования ? И каков наилучший подход к проверке этой «цепочки»? из зависимостей хорошо работают в синхронизации?

Позвольте мне проиллюстрировать вопросы. Предположим, у вас есть следующее «наследие» код:

<code>class House {
    protected $material;
    protected $door;
    protected $knob;

    public function __construct() {
        $this->door = new Door();
        $this->knob = $this->door->getKnob();
        $this->material = "stone";

        echo "House material: ".$this->material . PHP_EOL . "<br/>";
        echo "Door material: ".$this->door->getMaterial() . PHP_EOL . "<br/>";
        echo "Knob material: ".$this->knob->getMaterial() . PHP_EOL . "<br/>";
    }
}

class Door {
    protected $material;
    protected $knob;

    public function __construct() {
        $this->knob = new Knob();
        $this->material = "wood";
    }

    public function getKnob() {
        return $this->knob;
    }

    public function getMaterial () {
        return $this->material;
    }

}

class Knob {
    protected $material;

    public function __construct() {
        $this->material = "metal";
    }

    public function getMaterial () {
        return $this->material;
    }
}

$house = new House();
</code>

Насколько я понимаю, это плохо для модульного тестирования, поэтому мы заменим жестко запрограммированные зависимости на DI + класс Factory:

<code>class House {
    protected $material;
    protected $door;
    protected $knob;

    public function __construct($door) {
        $this->door = $door;
        $this->knob = $this->door->getKnob();
        $this->material = "stone";

        echo "House material: ".$this->material . PHP_EOL . "<br/>";
        echo "Door material: ".$this->door->getMaterial() . PHP_EOL . "<br/>";
        echo "Knob material: ".$this->knob->getMaterial() . PHP_EOL . "<br/>";
    }
}

class Door {
    protected $material;
    protected $knob;

    public function __construct($knob) {
        $this->knob = $knob;
        $this->material = "wood";
    }

    public function getKnob() {
        return $this->knob;
    }

    public function getMaterial () {
        return $this->material;
    }

}

class Knob {
    protected $material;

    public function __construct() {
        $this->material = "metal";
    }

    public function getMaterial () {
        return $this->material;
    }
}

class HouseFactory {
    public function create() {
        $knob = new Knob();
        $door = new Door($knob);
        $house = new House($door);

        return $house;
    }
}

$houseFactory = new HouseFactory();
$house = $houseFactory->create();
</code>

Теперь (и опять же, насколько я понимаю) Хаус, Дверь и Ручка могут быть хорошо протестированы с поддельными зависимостями. Но:

1) Что теперь происходит с HouseFactory?

Стоит ли просто:

Not test it since it doesn't have any application logic worth testing yet and Factories generally stay that way. Assume that if the independ tests for House, Door & Knob pass the Factory should be fine. Refactor the factory somehow, ie, using functions within the class to get each instance in such a way that one may override these functions via PHPUnit to return mock objects, just in case there is some extra logic in the class that could use some testing in the future.

2) Возможно ли настроить тесты, которые основаны на нескольких (не проверенных) зависимостях одновременно? Я понимаю, что технически это не модульное тестирование (возможно, интеграционное тестирование?), Но я думаю, что это все еще вполне выполнимо с помощью PHPUnit? Учитывая приведенный выше пример, я хотел бы иметь возможность настроить тест, который не только тестирует House, Door, Knob и HouseFactory изолированно, но также и результаты взаимодействия реальных объектов друг с другом, возможно, с некоторыми из их проверенные функции, такие как те, которые имеют дело с данными. Является ли PHPUnit плохим выбором для такого рода тестов?

Спасибо заранее за ваше время. Я понимаю, что некоторые из сделанных мною предположений могут быть неверными, поскольку я, очевидно, не являюсь экспертом в этом вопросе; исправления приветствуются и приветствуются.

Ответы на вопрос(2)

Ваш ответ на вопрос