如何单元测试创​​建Zend \ Db \ Sql \ Sql对象的方法?

时间:2013-12-11 22:41:28

标签: php unit-testing zend-framework2

我有这个方法,我想进行单元测试。因为它在方法中创建了Sql对象,所以我无法模拟它。

最初我想过让Sql成为一个实例属性,除了我每次在其他方法中使用它时都必须重置它,这很可能会导致很难调试错误(我不希望有可能如果可以避免的话,在其他后续的getter调用中得到一个“脏”的Sql对象。)

测试这些方法的常见模式是什么?

public function getConfigFromDb()
{
    if (!is_null($this->configInDb)) {
        return $this->configInDb;
    }

    $sql = new Sql($this->getSlaveDbAdapter());

    $select = $sql->select()
                  ->from('mytable');

    $statement = $sql->prepareStatementForSqlObject($select);
    $results   = $statement->execute();
    $results->buffer();

    $this->configInDb = $return;

    return $results;
}

1 个答案:

答案 0 :(得分:1)

@Julian你是对的,我会把它作为答案

在这种情况下,我会添加一个SqlFactory并将其注册为服务(在服务管理器配置中的工厂参数中),这样您就可以轻松地模拟服务以及从中获取的对象。

为了进一步讨论这个主题,我将所有对象创建委托给我可以使用ServiceManager调用的工厂。 事实上,这样,我可以孤立地测试我的Factory,注入它需要的所有依赖项,声明创建的实际对象是预期的对象。而且只要我在测试方法中需要Factory中的对象,我就可以提供真实的实例或模拟。