phpunit的代码覆盖率;can';我到不了一个地方

phpunit的代码覆盖率;can';我到不了一个地方,php,phpunit,xdebug,Php,Phpunit,Xdebug,在xdebug代码覆盖范围中,它显示了“return false;”(在“!$r”下面)这一行,这是我的测试没有覆盖的。但是,$sql基本上是硬编码的。我怎样才能得到这方面的保险?我是否以某种方式覆盖“$table”?或者为这部分测试杀死数据库服务器 我猜这可能是在告诉我我的模型写得不好,对吧?因为我不能很好地测试它。我怎样才能写得更好 因为这一行没有被覆盖,所以整个方法没有被覆盖,报告也被关闭 我对phpunit还不太熟悉。谢谢 我猜函数dbq()执行数据库查询。只需拔下数据库连接并重新运行

在xdebug代码覆盖范围中,它显示了“return false;”(在“!$r”下面)这一行,这是我的测试没有覆盖的。但是,$sql基本上是硬编码的。我怎样才能得到这方面的保险?我是否以某种方式覆盖“$table”?或者为这部分测试杀死数据库服务器

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

因为这一行没有被覆盖,所以整个方法没有被覆盖,报告也被关闭

我对phpunit还不太熟悉。谢谢



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


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

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

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

  • 你的模型课
  • 您的数据映射器,其角色是将模型“转换”为数据库模型
  • 直接访问表的DAO(或表数据网关)
这是一个非常有趣的模型,您应该看看它,它使您能够真正将模型与数据分离,从而只对模型部分执行测试(而不关心任何数据库问题)

但是在您的代码中,我建议您执行一个测试,让dbq()函数返回false(可能是故意让db connexion不可能),以实现完整的代码覆盖。

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

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