Невозможно получить доступ к дочернему свойству в родительском классе (вызов метода, унаследованного от родительского в дочернем объекте) - PullRequest
1 голос
/ 06 февраля 2012

Итак, это мой родительский класс для модульного тестирования (короткая версия):

<?php
class TestCaseAbstract extends PHPUnit_Framework_TestCase
{
    protected $_rawPostData;

    public function setUp()
    {
        // ...
    }

    /**
     *
     * @dataProvider provider 
     */
    public function testFoo($rawData)
    {
        // ...
    }

    public function provider()
    {
        return array(
            array(''),
            array($this->_rawData),
        );
    }

    public function tearDown()
    {
        // ...
    }
}

Это мой дочерний класс, фактический пример модульного теста:

class FooTestCase extends TestCaseAbstract
{
    public function setUp()
    {
        $this->_rawPostData = '<?xml version="1.0"?><request><bogus /></request>';

        parent::setUp();
    }
}

Теперь, когда язапустить модульный тестовый пример:

.phpunit --debug FooTestCase.php

Я получил это:

.
Starting test 'FooTestCase::testFoo with data set #0 ('')'.
.
Starting test 'FooTestCase::testFoo with data set #1 (NULL)'.
.

Как видите, второй модульный тест с данными $ this -> _ rawData говорит, что он выполнялся с данными NULL.Что не так с моим кодом?Похоже, что тестовый метод не может получить доступ к защищенному свойству $ this -> _ rawData.


Я надеюсь, что моя модель наследования не испорчена.Я сделал быстрый тест, чтобы убедиться, что наследование в PHP работает так, как я думаю:

<?php

class ParentClass
{
    protected $_property;

    public function getProperty()
    {
        return $this->_property;
    }
}

class ChildClass extends ParentClass
{
    public function __construct()
    {
        $this->_property = 'Hello';
    }
}

$childClass = new ChildClass();
var_dump($childClass->getProperty());

Это работает и выдает «Hello», как должно.Любые идеи, почему в моих модульных тестах поставщик данных возвращает NULL?

1 Ответ

3 голосов
/ 06 февраля 2012

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

Однако setUp() - это , а не , вызываемый перед методом поставщика данных. Вы можете обойти это, добавив метод для возврата нужных данных, которые может вызвать метод провайдера. Определите этот новый метод как абстрактный в базовом классе и переопределите его в дочернем. Также не забудьте сделать свой базовый класс абстрактным.

abstract class TestCaseAbstract extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provider 
     */
    public function testFoo($rawPostData)
    {
        // ...
    }

    public function provider()
    {
        return array(
            array(''),
            array($this->_getRawPostData()),
        );
    }

    protected abstract function _getRawPostData();
}

class FooTestCase extends TestCaseAbstract
{
    protected function _getRawPostData()
    {
        return '<?xml version="1.0"?><request><bogus /></request>';
    }
}

Обновление: Я написал небольшой тестовый пример, чтобы убедиться, что PHPUnit не вызывает setUp() перед методами поставщика данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...