我正在尝试使用 PHPUnit/DBUnit 来测试我的 Zend Framework DbTable 模型。我被带有时间戳的表绊倒了。
我正在尝试使用 assertDataSetsEqual 将插入的实际结果与预期结果进行比较。当然,当我将记录插入带有时间戳的表中时,时间戳字段会填充当前日期/时间。代表预期数据的数据集是静态的,因此时间戳不匹配。
我该如何处理这种情况?我可以让断言忽略时间戳列吗?
我正在尝试使用 PHPUnit/DBUnit 来测试我的 Zend Framework DbTable 模型。我被带有时间戳的表绊倒了。
我正在尝试使用 assertDataSetsEqual 将插入的实际结果与预期结果进行比较。当然,当我将记录插入带有时间戳的表中时,时间戳字段会填充当前日期/时间。代表预期数据的数据集是静态的,因此时间戳不匹配。
我该如何处理这种情况?我可以让断言忽略时间戳列吗?
多亏了这篇博文,我才找到了一个更好的解决方案。
我创建了一个函数,让我可以轻松地断言我的两个数据集是相等的。
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://stackoverflow.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);