0

在 xdebug 代码覆盖率中,它显示“return false;”行 (在“!$ r”下方)我的测试未涵盖。但是, $sql 基本上是硬编码的。我如何获得相关报道?我会以某种方式覆盖“$table”吗?或者为这部分测试杀死数据库服务器?

我想这可能是在告诉我我的模型写得不是很好,对吧?因为我不能很好地测试它。我怎样才能写得更好?

由于没有覆盖这一行,因此没有覆盖整个方法,并且报告关闭。

我对phpunit还很陌生。谢谢。


public function retrieve_all()
{
    $table = $this->tablename();
    $sql     = "SELECT t.* FROM `{$table}` as t";
    $r         = dbq ( $sql, 'read' );

    if(!$r)
    {
        return false;
    }

    $ret = array ();

    while ( $rs    = mysql_fetch_array ( $r, MYSQL_ASSOC ) )
    {
        $ret[] = $rs;
    }


    return $ret;
}
4

2 回答 2

1

理论上,您应该更好地将模型和所有与数据库相关的代码分开。

例如,在 Zend Framework 中,快速入门指南建议您拥有:

  • 你的模型类
  • 您的数据映射器,其作用是将模型“转换”为数据库模型。
  • 直接访问表的 DAO(或表数据网关)

这是一个非常有趣的模型,您应该看看它,它使您能够真正将模型与数据分离,从而仅对模型部分执行测试(并且不关心任何数据库问题/问题)

但是在您的代码中,我建议您执行一个测试,让 dbq() 函数返回 false (也许“故意”不可能有 db 连接),以便获得完整的代码覆盖率。

我经常遇到这种情况,测试所有“错误案例”会花费你太多时间,所以我放弃了 100% 的代码覆盖率。

于 2010-03-17T15:07:26.353 回答
0

我猜该函数dbq()执行数据库查询。只需拔下您的数据库连接并重新运行测试。

您无法测试的原因是您正在使用全局资源:您的数据库连接。您通常可以通过将连接对象提供给测试方法(或类)来避免此问题。

于 2010-03-16T15:11:33.127 回答