4

我正在尝试使用 PHPUnit/DBUnit 来测试我的 Zend Framework DbTable 模型。我被带有时间戳的表绊倒了。

我正在尝试使用 assertDataSetsEqual 将插入的实际结果与预期结果进行比较。当然,当我将记录插入带有时间戳的表中时,时间戳字段会填充当前日期/时间。代表预期数据的数据集是静态的,因此时间戳不匹配。

我该如何处理这种情况?我可以让断言忽略时间戳列吗?

4

3 回答 3

2

多亏了这篇博文,我才找到了一个更好的解决方案。

我创建了一个函数,让我可以轻松地断言我的两个数据集是相等的。

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'))
        );

这使得测试与具有时间戳列的表相对应的模型变得更容易/更清晰。

于 2012-07-24T17:37:32.893 回答
0

我还没有找到任何让我认为这是可能的东西。

我最终解决它的方法是在更新后查询表,将结果保存在一个数组中,然后使用 assertEquals 确保正确的字段被更新。

于 2012-07-20T19:29:26.963 回答
0

感谢 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);
于 2014-05-22T23:11:21.857 回答