Тестирование абстрактных методов

2 мин. 12 сек.
115
3

Объект абстрактного класса мы не можем создать напрямую. Поэтому работать с ним будем через stub. Что такое stub можно прочитать в статье про Модульное тестирование.

Пример абстрактного класса Abstract_Suit:

abstract class Abstract_Suit {

	abstract public function abstract_method();

}

Тестируем с помощью метода getMockForAbstractClass

use PHPUnit\Framework\TestCase;

class Test_Suit extends TestCase {

	public function test_abstract_class() {
		$stub = $this->getMockForAbstractClass( 'Abstract_Suit' );
		$stub->expects( $this->exactly( 1 ) )
		     ->method( 'abstract_method' )
		     ->will( $this->returnValue( 'abstract result' ) );

		$this->assertSame( 'abstract result', $stub->abstract_method() );
	}

}

Создаем stub для абстрактного класса Abstract_Suit:

$stub = $this->getMockForAbstractClass( 'Abstract_Suit' );

Ожидаем, что будет вызван 1 раз:

$stub->expects( $this->exactly( 1 ) )

Метод abstract_method:

->method( 'abstract_method' )

И будет возвращен результат abstract result:

->will( $this->returnValue( 'abstract result' ) );

Тестируем с помощью анонимных классов

use PHPUnit\Framework\TestCase;

class Test_Suit extends TestCase {

	public function test_abstract_class_by_anonymous() {
		$suit = new class extends Abstract_Suit {

			public function abstract_method() {
				return 'rewrite abstract result';
			}

		};

		$this->assertSame( 'rewrite abstract result', $suit->abstract_method() );
	}

}

В целом такой код более простой для понимания но поддерживается только с версии PHP 7.0+.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *