Рецепты для тестирования

Вызов объекта без конструктора

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

class Duck {

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

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

}

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

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