模拟新创建的实例?

时间:2009-09-10 12:38:31

标签: php unit-testing new-operator phpunit

我的旧代码没有使用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”来获取实例 我的模拟对象被忽略,这是有道理的

所以我只看到两个选项

  1. phpunit的一些功能我不知道 - 这就是我在这里问的原因^^
  2. 我必须修改旧代码 - 我知道会更好
  3. 所以,有人知道选项1的答案吗?

    全部

1 个答案:

答案 0 :(得分: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;
    }
}

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