Столбец метки времени дескриптора PHPUnit/DBUnit

Я пытаюсь использовать PHPUnit/DBUnit для тестирования моих моделей Zend Framework DbTable. Я запутался в таблицах с меткой времени.

Я пытаюсь использовать assertDataSetsEqual, чтобы сравнить фактические результаты вставки с ожидаемыми результатами. Конечно, когда я вставляю запись в таблицу с отметкой времени, поле отметки времени заполняется текущей датой / временем. Набор данных, представляющий ожидаемые данные, является статическим, поэтому временная метка не будет совпадать.

Как я могу справиться с этой ситуацией? Можно ли заставить утверждение игнорировать столбец метки времени?

3 ответа

Решение

Я только что нашел намного лучшее решение для этого благодаря этому сообщению в блоге.

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

protected function assertDataSetEquals(
        $ExpectedXMLFileName,
        array $options = array()) {

    $model  = (isset($options['model'])) ?
        $options['model'] :
        $this->_object;
    $excludeColumns = (isset($options['excludeColumns'])) ?
        $options['excludeColumns'] :
        null;

    $ds = new Zend_Test_PHPUnit_Db_DataSet_DbTableDataSet();
    $ds->addTable($model);

    $dsFiltered = (isset($excludeColumns)) ?
        $this->filterColumns($model, $ds, $excludeColumns) :
        $ds;

    $this->assertDataSetsEqual(
        $this->createFlatXmlDataSet(
            APPLICATION_PATH 
            . '/../tests/fixtures/models/'
                . $ExpectedXMLFileName . '.xml'
        ),
        $dsFiltered
    );
}

И частная функция для возврата отфильтрованного набора данных.

private function filterColumns(
        $model,
        $dataSet,
        $excludeColumns) {

    $dsFiltered = 
        new PHPUnit_Extensions_Database_DataSet_DataSetFilter($dataSet);
    $dsFiltered->setExcludeColumnsForTable(
            $model->getName(),
            $excludeColumns
        );

    return $dsFiltered;
}

Теперь, чтобы сравнить два набора данных, исключая любые столбцы, я просто делаю это.

    $this->assertDataSetEquals(
            'TableWithTimestampIWantToIgnoreUpdate',
            array('excludeColumns'=>array('timestamp','id'))
        );

Это значительно упрощает и упрощает тестирование моделей, соответствующих таблицам со столбцом метки времени.

Я не нашел ничего, что заставляет меня думать, что это возможно.

В конце концов, я решил, что запросить таблицу после обновления, сохранить результаты в массиве и затем использовать assertEquals, чтобы убедиться, что соответствующие поля были обновлены.

Благодаря bconrad я добавил эту функцию в свой тестовый класс:

/**
 * @param Zend_Test_PHPUnit_Db_DataSet_QueryDataSet $dataSet
 * @param array $excludeTheseColumnsOfTheseTables Array where the keys are table names and the values are arrays of column names to exclude.
 * @return PHPUnit_Extensions_Database_DataSet_DataSetFilter
 * @see http://stackru.com/a/11636295/470749
 */
protected function filterColumns($dataSet, $excludeTheseColumnsOfTheseTables)
{
    $filteredDataset = new \PHPUnit_Extensions_Database_DataSet_DataSetFilter($dataSet);
    foreach ($excludeTheseColumnsOfTheseTables as $tableName => $excludedColumns) {
        $filteredDataset->setExcludeColumnsForTable($tableName, $excludedColumns);
    }
    return $filteredDataset;
}

Тогда отфильтровать набор данных так же просто, как это:

$queryDataSet = new \Zend_Test_PHPUnit_Db_DataSet_QueryDataSet($this->getConnection());
$queryDataSet->addTable('posts', 'SELECT * FROM posts');
$queryDataSet->addTable('users', 'SELECT * FROM users');
$excludeTheseColumnsOfTheseTables = array(
    'users' => array('created', 'modified'),
    'posts' => array('modified'));
$filteredDataset = $this->filterColumns($queryDataSet, $excludeTheseColumnsOfTheseTables);
$this->assertDataSetsEqual($this->getAssertionXmlDataSet('asrt.xml'), $filteredDataset);
Другие вопросы по тегам