我要替换一个返回对象数组的方法:
private function getValues(array $rows)
{
$values = [];
foreach ($rows as $data) {
$values[] = $this->mapToModel($data);
}
return $values;
}
使用发电机代替:
private function getValues(array $rows)
{
foreach ($rows as $data) {
yield $this->mapToModel($data);
}
}
但是我的测试似乎根本没有输入/覆盖这个getValues()
函数(从公共方法内部调用)。这是正常行为吗?
更新
我正在运行:带有Xdebug 2.7.2的PHP 7.2.21
以下是测试和代码的相关部分:
class SettlementDB
{
/**
* @var \PDO
*/
private $db;
/**
* @param \PDO $db
*/
public function __construct(\PDO $db)
{
$this->db = $db;
}
public function getAll()
{
$q = $this->db->prepare('SELECT * FROM table');
$q->execute();
return $this->getValues($q->fetchAll());
}
/**
* @param array $rows
* @return Generator
*/
private function getValues($rows)
{
foreach ($rows as $data) {
yield $this->mapToModel($data);
}
}
public function mapToModel(object $data)
{
return (object) [
//
];
}
}
class SettlementServiceTest extends MockeryTestCase
{
public function test_ItWorks()
{
$mock_PDOStatement = \Mockery::spy(\PDOStatement::class);
$mock_PDOStatement->shouldReceive('fetchAll')->once()->andReturn([(object) ['id' => '_id_']]);
$mock_PDO = \Mockery::spy(\PDO::class);
$mock_PDO->shouldReceive('prepare')->once()->andReturn($mock_PDOStatement);
$settlementDB = new SettlementDB($mock_PDO);
$settlementDB->getAll();
}
}
答案 0 :(得分:0)
从OP应答
这真的很简单,我不敢相信我错过了它。由于getValues()
中的代码是生成器,因此根本无法运行,直到在foreach循环之类的迭代器中使用它为止。
因此,如果我们在测试中添加foreach,则代码覆盖范围将覆盖getValues()
函数。
例如:
$result = $settlementDB->getAll();
foreach ($result as $row) {
}