代码覆盖率与phpunit;不能到一个地方

时间:2010-03-16 15:05:39

标签: php phpunit xdebug

在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;
}

2 个答案:

答案 0 :(得分:1)

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

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

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

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

但是在你的代码中,我建议你执行一个测试,你有dbq()函数返回false(可能有意无意地“使用db连接”),以便拥有完整的代码覆盖。

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

答案 1 :(得分:0)

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

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