PHPUnit不会运行Generator函数

时间:2019-11-18 13:28:18

标签: php phpunit

我要替换一个返回对象数组的方法:

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();
    }
}

1 个答案:

答案 0 :(得分:0)

从OP应答

这真的很简单,我不敢相信我错过了它。由于getValues()中的代码是生成器,因此根本无法运行,直到在foreach循环之类的迭代器中使用它为止。

因此,如果我们在测试中添加foreach,则代码覆盖范围将覆盖getValues()函数。

例如:

$result = $settlementDB->getAll();

foreach ($result as $row) { 
}