Як перевірити конкретні методи абстрактного класу за допомогою PHPUnit?
Я б очікував, що мені доведеться створити якийсь об’єкт у рамках тесту. Хоча я не знаю, що найкраща практика для цього чи якщо PHPUnit це дозволяє.
Як перевірити конкретні методи абстрактного класу за допомогою PHPUnit?
Я б очікував, що мені доведеться створити якийсь об’єкт у рамках тесту. Хоча я не знаю, що найкраща практика для цього чи якщо PHPUnit це дозволяє.
Відповіді:
Одиничне тестування абстрактних класів не означає тестування інтерфейсу, оскільки абстрактні класи можуть мати конкретні методи, і ці конкретні методи можна перевірити.
Не так вже й рідко, коли ви пишете якийсь код бібліотеки, мати певний базовий клас, який ви очікуєте розширити у вашому шарі програми. І якщо ви хочете переконатися, що код бібліотеки перевірений, вам потрібні засоби для UT конкретних методів абстрактних класів.
Особисто я використовую PHPUnit, і він так називає заглушки та знущаються над об’єктами, щоб допомогти вам протестувати подібні речі.
Прямо з керівництва PHPUnit :
abstract class AbstractClass
{
public function concreteMethod()
{
return $this->abstractMethod();
}
public abstract function abstractMethod();
}
class AbstractClassTest extends PHPUnit_Framework_TestCase
{
public function testConcreteMethod()
{
$stub = $this->getMockForAbstractClass('AbstractClass');
$stub->expects($this->any())
->method('abstractMethod')
->will($this->returnValue(TRUE));
$this->assertTrue($stub->concreteMethod());
}
}
Об'єкт макету дає вам декілька речей:
Це гарне запитання. Я теж це шукав.
На щастя, PHPUnit вже має getMockForAbstractClass()
метод для цього випадку, наприклад
protected function setUp()
{
$stub = $this->getMockForAbstractClass('Some_Abstract_Class');
$this->_object = $stub;
}
Зауважте, що для цього потрібен PHPUnit> 3.5.4. У попередніх версіях виникла помилка .
Щоб оновити до новітньої версії:
sudo pear channel-update pear.phpunit.de
sudo pear upgrade phpunit/PHPUnit
Слід зазначити, що станом на PHP 7 додано підтримку анонімних класів . Це дає додатковий шлях для налаштування тесту для абстрактного класу, який не залежить від функціональності PHPUnit.
class AbstractClassTest extends \PHPUnit_Framework_TestCase
{
/**
* @var AbstractClass
*/
private $testedClass;
public function setUp()
{
$this->testedClass = new class extends AbstractClass {
protected function abstractMethod()
{
// Put a barebones implementation here
}
};
}
// Put your tests here
}
Еран, ваш метод повинен працювати, але це суперечить тенденції написання тесту до фактичного коду.
Я б запропонував написати свої тести на потрібну функціональність неабразованого підкласу відповідного абстрактного класу, потім записати і абстрактний клас, і підклас реалізації, і нарешті запустити тест.
Ваші тести, очевидно, повинні перевірити визначені методи абстрактного класу, але завжди за допомогою підкласу.
Відповідь Нельсона неправильна.
Для абстрактних занять не потрібно, щоб усі їх методи були абстрактними.
Реалізовані методи - це те, що нам потрібно протестувати.
Що ви можете зробити, це створити фальшивий клас заглушки на тестовому файлі одиниці, запропонувати йому розширити абстрактний клас та реалізувати лише те, що потрібно без функціональності, звичайно, і перевірити це.
Ура.
Якщо ви не хочете підкласи абстрактного класу просто для того, щоб виконати одиничний тест методів, які вже реалізовані в абстрактному класі, ви можете спробувати перевірити, чи дозволяє ваша рамка глузувати з абстрактних класів.