Тестирование объектов с извращениями в конструкторе

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

class Duck {

	public function __construct() {
		$this->life = new Life();
	}

	public function say() {
		echo 'quack' . PHP_EOL;
	}

}

Для того, чтобы протестировать метод say() нам нужно как-то замокать new Life с помощью заглушек для Hard Dependency или избавится от вызова конструктора. Второй вариант лучше т.к. тесты будут выполняться в разы быстрее:

use PHPUnitFrameworkTestCase;

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' ) возвращает инстанс без вызова конструктора.

Добавить комментарий

%d такие блоггеры, как: