Методы тестирования абстрактного класса с помощью PHPUnit - PullRequest
7 голосов
/ 29 марта 2012

У меня есть абстрактный класс с общими методами, который я хочу протестировать, поэтому мне не нужно тестировать их в каждом классе, расширяющем этот класс.

abstract class Class1 implements iClass1
{
    const VALUE = 'A';
    private $Return;    
    public function __construct($Field = NULL)
    {
        if( ! is_null($Field) )
            $this->SetField($Field);
    }
    public function GetField()
    {
        return $this->Return;
    }
    public function SetField($Field)
    {
        if (strlen($Field) != 3)
        throw new CLASS1_EXCEPTION('Field "' . $Field . '" must be 3 digits.');

    $this->Return = $FieldCode;
    }
    abstract function CalculateData();
}

Я хочусоздайте базовый тестовый пример, который будет проверять конструктор, GetField и другие функции, а затем мои другие тестовые файлы могут тестировать абстрактные функции.

Я хочу иметь возможность проверить, что const не изменился,поле выдает исключение и т.д ...

TEST:

class TEST_CLASS1 extends PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        require_once('CLASS1.php');
    }
    public function testConstants()
    {
        $this->assertEquals(CLASS1, 'A');
    }

    /* @expectedException CLASS1_EXCEPTION
    public function testLargeFieldException()
    {
        $class1 = new CLASS1('ABCD');
        $class1 = new CLASS1();
        $class1->SetField('ABCD');
    }
}

Как создать тесты, поскольку я не могу создать объект CLASS1, поскольку он является абстрактным классом?

1 Ответ

19 голосов
/ 30 марта 2012

Один из вариантов - создать

TestableClass1 extends Class1 {
     public function CalculateData() {}
}

и использовать этот класс для своих тестов.

Другой вариант - сделать то же самое, но использование phpunit API предоставляет вам:

Для этого см. Образец Пример 10.13: Тестирование конкретных методов абстрактного класса из phpunit documentation:

Более простой пример:

abstract class AbstractClass
{
    public function concreteMethod()
    {
        return 5;
    }

    public abstract function abstractMethod();
}

class AbstractClassTest extends PHPUnit_Framework_TestCase
{
    public function testConcreteMethod()
    {
        $sut = $this->getMockForAbstractClass('AbstractClass');
        $this->assertSame(5, $sut->concreteMethod());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...