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

Константы

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

class Constant {

	public function abspath() {
		return ABSPATH;
	}

}

Для тестирования необходимо немного изменить код. Константы необходимо получать через функцию constant:

class Constant {

	public function abspath() {
		return constant( 'ABSPATH' );
	}

}

Для тестирования используем библиотеку lucatume/function-mocker. Установим ее через composer:

composer require lucatume/function-mocker

В файле bootstrap.php инициализируем FunctionMocker:

use tad\FunctionMocker\FunctionMocker;

require_once 'path/to/vendor/autoload.php';

FunctionMocker::init(
	[
		'whitelist'             => [
			realpath( 'path/to/root/of/the/project/' ),
		],
		'redefinable-internals' => [ 'constant' ],
	]
);

В тестовом классе нужно обновить фикстуры setUp и tearDown, заменить функцию constant и убедиться, что данная функция вызвана правильно:

use tad\FunctionMocker\FunctionMocker;
use PHPUnit\Framework\TestCase;

class Test_Constant extends TestCase {

	public function setUp(): void {
		FunctionMocker::setUp();
		parent::setUp();
	}

	public function tearDown(): void {
		parent::tearDown();
		FunctionMocker::tearDown();
	}

	public function test_abspath() {
		$abspath = '/abspath/';
		$mock_constant = FunctionMocker::replace( 'constant', $abspath );
		$constant = new Constant();

		$this->assertSame( $abspath, $constant->abspath() );

		$mock_constant->wasCalledWithOnce( [ 'ABSPATH' ] );
	}

}