PHPUnit, Использование класса conts для изменения состояния - PullRequest
3 голосов
/ 06 апреля 2011

Я изучаю Zend, а также PHPUnit.

Вот что у меня ниже


public function changeToIllegalState()
{
    return array(
        array( Application_Model_SomeModel::FAIL ),
        array( Application_Model_SomeModel::SUCCESS )
    );
}

/**
 * @dataProvider changeToIllegalState
 * @expectedException IllegalStateChangeException
 */

public function testIllegalStateChangeGeneratesException( $state )
{
    $mapper = new Application_Model_Mapper_SomeModel();
    $model = new Application_Model_SomeModel();

    $model->changeState( $state );

    $mapper->save( $model );

}

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

PHPUnit говорит, что не может найти класс Model в методе dataprovider. Однако, если я попытаюсь использовать константы в методах тестирования, все это работает, и нет никаких проблем. Я использую автозагрузчик Zend для загрузки своих классов, и все это было до сих пор. Я знаю, что мог бы просто ввести значения для самих констант, но я не знаю, почему я получаю эту ошибку.

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

РЕДАКТИРОВАТЬ:

Я также попробовал следующее, но оно не будет работать с классами.



protected $_FAIL;
protected $_model;

public function setUp()
{
    parent::setUp();
    $this->_model = new Application_Model_SomeModel();
    $this->_FAIL = Application_Model_SomeModel::FAIL;
}

Теперь, когда я пытаюсь использовать $ _FAIL в методе провайдера, я получаю значение NULL вместо ожидаемой строки 'fail'. Это действительно странно.

Ответы [ 2 ]

4 голосов
/ 06 апреля 2011

PHPUnit создает экземпляры всех тестовых случаев, которые будут выполняться перед выполнением каких-либо тестов.

  • Один на метод теста без поставщика данных.
  • Один на метод поставщика данных.
  • Один массив для каждого параметра возвращается от каждого поставщика данных, поэтому поставщик, который возвращает массив из четырех массивов, получает четыре экземпляра тестового набора..php, он должен загрузить класс, содержащий эти константы.Однако я бы попробовал проверить, чтобы увидеть:
    public function changeToIllegalState()
    {
        require_once 'Zend/Loader/Autoloader';
        Zend_Loader_Autoloader::getInstance();
    
        return array(
            array( Application_Model_SomeModel::FAIL ),
            array( Application_Model_SomeModel::SUCCESS )
        );
    }
    

    Или Zend Framework добавляет каталог моделей в путь включения в одном из методов setUp() тестового примера вместо этого?

3 голосов
/ 06 апреля 2011

Я наконец выяснил, что происходит.

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

Я вставил несколько эхо-операторов в методы поставщика данных и методы setUp, чтобы подтвердить это.Все эхо-сигналы метода провайдера всегда печатаются до эхо-кода метода установки.

Кроме того, эхо-методы методов провайдера отражались только тогда, когда методы были объявлены как провайдеры данных с аннотацией поставщика данных.То есть любые методы, не объявленные как методы поставщика данных с аннотацией, вообще не вызываются.

Мое первоначальное предположение о том, что PHPUnit вызывал методы провайдера до того, как мой метод setUp оказался правильным.

Чтобы это исправить, я должен создать экземпляр своего объекта Zend_Application в файле начальной загрузки, а не в методе setUp.Я не хотел этого делать, потому что мне не нужен объект Zend_Application для всех тестовых случаев, но я думаю, что это то, чем я в конечном итоге буду заниматься, поскольку это немного облегчит мою жизнь.

@ David Harkness Вы были правы в отношении настройки автозагрузчика в начальной загрузке в этом случае, но мне также нужно было настроить автозагрузку приложения (путем создания объекта Zend_Application), а не только автозагрузку библиотеки Zend.

...