Тестирование абстрактных методов
Объект абстрактного класса мы не можем создать напрямую. Поэтому работать с ним будем через 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+.
Источник: WP Punk.