如何在PHPSpec中处理条令QueryBuilder?

如何在PHPSpec中处理条令QueryBuilder?,php,testing,doctrine,doctrine-query,phpspec,Php,Testing,Doctrine,Doctrine Query,Phpspec,我正试图为一个包含DBALQueryBuilder的类编写一个规范测试 请告诉我,如果我完全没有理解模拟的意义,我知道有一句话是“不要模拟测试类”,但不确定这在这个上下文中是如何应用的 以下是课程代码: // Doctrine Connection Class creating QueryBuilder class $queryBuilder = $this->conn->createQueryBuilder(); $queryBuilder->select([

我正试图为一个包含DBALQueryBuilder的类编写一个规范测试

请告诉我,如果我完全没有理解模拟的意义,我知道有一句话是“不要模拟测试类”,但不确定这在这个上下文中是如何应用的

以下是课程代码:

// 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
它将处理事件
错误:Prophecy\Prophecy\MethodProphecy类的对象无法转换为中的字符串
第97行
在本例中,第97行是
$queryBuilder->from


有人有什么想法吗?提前谢谢

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


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

您可以发布完整类方法和完整类规范方法吗?@gvf唯一的附加部分是queryBuilder由容器构造,并且正在运行查询并生成结果。我将更新原始帖子来表示这一点。