我正在尝试为包含理论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
行。
有人有什么想法吗?预先感谢!
答案 0 :(得分:1)
我会考虑不为此编写单元测试,因为您的测试将基本上与方法中的调用1:1匹配。您只有重复的代码,每次修改查询时都需要更改。
也许您想使用behat或phpunit编写功能测试。在此测试中,您必须设置一个数据库,例如在内存中的sqlite中,创建架构,添加一些基本数据(夹具),然后使用您的代码执行查询。通过此测试,您将确保无论如何更改方法,都将从表中的一组给定条目中获得预期结果。此测试使测试较少依赖于编写查询的方式,而侧重于输入和输出。