【问题标题】:Code coverage with phpunit; can't get to one placephpunit 的代码覆盖率;无法到达一个地方
【发布时间】:2011-01-28 04:01:55
【问题描述】:

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

【问题讨论】:

    标签: php phpunit xdebug


    【解决方案1】:

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

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

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

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

    但在您的代码中,我建议您执行一个测试,让 dbq() 函数返回 false(可能“故意”无法实现 db 连接),以获得完整的代码覆盖范围。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-04
        • 2012-08-04
        • 2018-05-29
        • 2012-01-18
        • 2019-08-13
        • 2012-01-14
        • 2011-05-27
        • 2017-02-22
        相关资源
        最近更新 更多