0

我有没有使用 TDD 的旧代码现在我想为一个看起来像这样的函数编写一个测试

function somefunction($someargs){
    // do a few checks on $someargs
    $database = new DB_PG();
    $result = $database->select($query);
    // do some changes on result
    return $result;
}

因为我对 phpunit 和测试没有太多经验,所以我的问题是:我如何模拟 DB_PG?我在测试中尝试了 getMock(),但由于该函数使用“new”来获取实例,所以我的模拟对象被忽略了,这是有道理的

所以我只看到 2 个选项

  1. 我不知道 phpunit 的一些特性 - 这就是我在这里问的原因 ^^
  2. 我必须修改旧代码 - 我知道这会更好

那么,有人知道选项1的答案吗?

谢谢大家

4

1 回答 1

1

选项1

您可以将功能更改为如下工作:

function someFunc($existingArgs, $db = null)
{
    $db = (is_null($db)) = new DB_PG();
    $result = $db->select($query)

    $return $result;
}

这样你可以传入一个 db 实例,这至少可以让你测试这个函数,将来你可以重构一些东西,比如 someFunc 的工作是在模型上,而 db 加载的东西是通过 dao/repository/factory 发生的。

选项 2

如果 DB_PG 尚未通过此函数所在文件中的 require/include 引入,您可以在测试类中定义一个虚拟类

class DB_PG
{
    public function select($query)
    {
        //use phpunit's libs to output a mock object, you'll need to use the PHPUnit_Framework_Mock::generate() static method, I think that's the name.
        return $mockResult;
    }
}

这样你就可以控制结果发生了什么。

于 2009-09-10T16:57:54.540 回答