如何在PHPSpec中处理Doctrine QueryBuilder?

时间:2018-08-21 16:54:53

标签: php testing doctrine doctrine-query phpspec

我正在尝试为包含理论DBAL queryBuilder的类编写规格测试。

请告诉我,如果我完全错过了模拟的要点,我了解到有短语“不要模拟测试过的类”,但不确定在这种情况下如何应用。

这是课程代码:

// Doctrine Connection Class creating QueryBuilder class
$queryBuilder = $this->conn->createQueryBuilder();    

$queryBuilder->select([
    'some',
    'field',
    'to_get'
]);
$queryBuilder->from('tableName', 'p');
$queryBuilder->innerJoin('p', 'anotherTableName', 'd', 'd.id = :dId');
$queryBuilder->where('p.id = :pId');
$queryBuilder->setParameters([
    ':dId' => 123,
    ':pId' => 456,
])
->setMaxResults(1);

$stm = $query->execute();
$result = $stm->fetch(\PDO::FETCH_ASSOC);

这是我为它编写PHPSPec测试的失败尝试:

$queryBuilder->select([
    'some',
    'field',
    'to_get'
])->shouldBeCalled()->willReturn($queryBuilder->getWrappedObject());
$queryBuilder->from('tableName', 'p')->shouldBeCalled()->willReturn($queryBuilder->getWrappedObject());
$queryBuilder->innerJoin('p', 'anotherTableName', 'd', 'd.id = :dId')->shouldBeCalled()->willReturn($queryBuilder->getWrappedObject());
$queryBuilder->where('p.id = :pId')->shouldBeCalled()->willReturn($queryBuilder->getWrappedObject());
$queryBuilder->setParameters([
    ':dId' => 123,
    ':pId' => 456,
])->shouldBeCalled()->willReturn($queryBuilder->getWrappedObject());

这是我收到的错误:

 it will handle event
      error: Object of class Prophecy\Prophecy\MethodProphecy could not be converted to string in
      <<FILEPATH OMITTED>> line 97

在这种情况下,第97行是$queryBuilder->from行。

有人有什么想法吗?预先感谢!

1 个答案:

答案 0 :(得分:1)

我会考虑不为此编写单元测试,因为您的测试将基本上与方法中的调用1:1匹配。您只有重复的代码,每次修改查询时都需要更改。

也许您想使用behat或phpunit编写功能测试。在此测试中,您必须设置一个数据库,例如在内存中的sqlite中,创建架构,添加一些基本数据(夹具),然后使用您的代码执行查询。通过此测试,您将确保无论如何更改方法,都将从表中的一组给定条目中获得预期结果。此测试使测试较少依赖于编写查询的方式,而侧重于输入和输出。