Тестирование объектов с извращениями в конструкторе
Иногда разработчики добавляют в конструктор какие-то нежелательные эффекты, вызовы различных методов или зависимости с другими объектами.
Например:
class Duck {
public function __construct() {
$this->life = new Life();
}
public function say() {
echo 'quack' . PHP_EOL;
}
}
Для того, чтобы протестировать метод say()
нам нужно как-то замокать new Life
с помощью заглушек для Hard Dependency или избавится от вызова конструктора. Второй вариант лучше т.к. тесты будут выполняться в разы быстрее:
use PHPUnit\Framework\TestCase;
class Test_Duck extends TestCase {
public function tearDown(): void {
Mockery::close();
parent::tearDown();
}
public function test_say() {
$duck = Mockery::mock( 'Duck' )->makePartial();
$duck->say();
}
}
Метод makePartial
в Mockery::mock( 'Duck' )
возвращает инстанс без вызова конструктора.
Источник: WP Punk.