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