Столбец метки времени дескриптора 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);