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

Hard Dependencies

Большинство порождающих паттернов возвращают объект какого-нибудь класса. Как подменить вызов объекта?

Исходный код:

class Factory_With_Hard_Dependency {

	public function use_hard_dependency(): Hard_Dependency {
		return new Hard_Dependency();
	}

}

Так как объект Hard_Dependency мы не можем передать в Factory_With_Hard_Dependency, то необходимо переопределить его глобально:

use  \PHPUnit\Framework\TestCase;

class Test_Factory_With_Hard_Dependency extends TestCase {

	/**
	 * @runInSeparateProcess
	 * @preserveGlobalState disabled
	 */
	public function test_use_hard_dependency() {
		$hard = Mockery::mock( 'overload:Hard_Dependency' );
		$factory = new Factory_With_Hard_Dependency();

		$this->assertSame( $hard, $factory->use_hard_dependency() );
	}

}

С помощью приставки overload мы переопределям класс глобально. Так же очень важны аннотации в тесту @runInSeparateProcess и @preserveGlobalState disabled. Которые позволяют запустить тестовый метод в отдельном процессе. Это нужно для того, чтобы не было конфликтов в следующих тестовых методов, где будет использоваться объекты Hard_Dependency.