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

Замена die/exit

Если в коде вы используете die/exit то PHPUnit прекратит свою работу в этот момент. Для этого нам нужно заменить конструкцию exit/die. Но это сделать сложно т.к. Functions Mocker с этим не справляется.

Пример:

class Duck {
 
	public function i_want_use_exit() {
		exit;
	}
 
}

Меняем класс следующий образом:

class Duck {
 
	public function i_want_use_exit() {
		return $this->exit();
	}

	/**
	 * @codeCoverageIgnore
	 */
	protected function exit() {
		exit;
	}
 
}

Вместо реального объекта создаем частичного двойника. Затем разрешаем вызов защищенных методов и делаем заглушку для метода exit():

use PHPUnit\Framework\TestCase;

class Test_Duck extends TestCase {
 
	public function test_i_want_use_exit() {
		$duck = \Mockery::mock( Duck::class )->makePartial();
		$duck->shouldAllowMockingProtectedMethods();
		$duck
			->shouldReceive( 'exit' )
			->once();

		$duck->i_want_use_exit();
	}

}