【问题标题】:How to unit test a method that creates a Zend\Db\Sql\Sql object?如何对创建 Zend\Db\Sql\Sql 对象的方法进行单元测试?
【发布时间】:2013-12-11 22:41:28
【问题描述】:

我有这个方法,我想对其进行单元测试。由于它是在方法内部创建 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;
}

【问题讨论】:

  • 在您的情况下,我将添加一个 SqlFactory 并将其注册为服务(在服务管理器配置中的工厂参数中),这样您就可以轻松地模拟服务以及您将从中获得的对象.
  • @SmasherHell 为什么您将其发布为评论而不是答案?这看起来非常合理。

标签: php unit-testing zend-framework2


【解决方案1】:

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

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

为了进一步讨论这个主题,我将所有对象创建委托给我可以使用 ServiceManager 调用的工厂。 事实是,这样,我可以单独测试我的工厂,注入它需要的所有依赖项,断言创建的实际对象是预期的对象。并且任何时候我在测试的方法中需要一个来自 Factory 的对象,我都可以提供一个真实的实例,或者一个 Mock。

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多