1
resposta

LeilaoDAOMock está executando o __construct() de LeilaoDAO

Dado o meu arquivo EncerradorTest.php:

<?php

namespace Alura\Leilao\Tests\Service;

use Alura\Leilao\Dao\Leilao as LeilaoDao;
use Alura\Leilao\Model\Leilao;
use Alura\Leilao\Service\Encerrador;
use DateTimeImmutable;
use PHPUnit\Framework\TestCase;

class EncerradorTest extends TestCase
{
    public function testLeiloesComMaisDeUmaSemanaDevemSerEncerrados()
    {
        // Cria o primeiro leilão
        $leilao1 = new Leilao(
            'Fiat 147 0KM',
            new \DateTimeImmutable('8 days ago')
        );

        // Cria o segundo leilão
        $leilao2 = new Leilao(
            'Variant 1972 0KM',
            new \DateTimeImmutable('10 days ago')
        );

        // Cria um mock da classe LeilaoDao
        $leilaoDAO = $this->createMock(LeilaoDao::class);

        // Imita o método "recuperarNaoFinalizados"
        $leilaoDAO->method('recuperarNaoFinalizados')
            ->willReturn([$leilao1, $leilao2]);

        // Imita o método "recuperarFinalizados"
        $leilaoDAO->method('recuperarFinalizados')
            ->willReturn([$leilao1, $leilao2]);

        // Espera que o método "atualiza" seja chamado uma vez
        // para cada leilão
        $leilaoDAO->expects($this->exactly(2))
            ->method('atualiza')
            ->withConsecutive(
                [$leilao1],
                [$leilao2]
            );

        // Encerra os leilões
        $encerrador = new Encerrador($leilaoDAO);
        $encerrador->encerra();

        // Busca os leilões finalizados
        $leiloesFinalizados = [$leilao1, $leilao2];

        // Testa se os leilões que foram finalizados estão corretos
        self::assertCount(2, $leiloesFinalizados);
        self::assertTrue($leiloesFinalizados[0]->estaFinalizado());
        self::assertTrue($leiloesFinalizados[1]->estaFinalizado());
    }
}

E o arquivo Dao/Leilao.php:

<?php

namespace Alura\Leilao\Dao;

use Alura\Leilao\Infra\ConnectionCreator;
use Alura\Leilao\Model\Leilao as ModelLeilao;

class Leilao
{
    private $con;

    public function __construct()
    {
        var_dump('blablabla conexão');
        $this->con = ConnectionCreator::getConnection();
    }

    public function salva(ModelLeilao $leilao): void
    {
        $sql = 'INSERT INTO leiloes (descricao, finalizado, dataInicio) VALUES (?, ?, ?)';
        $stm = $this->con->prepare($sql);
        $stm->bindValue(1, $leilao->recuperarDescricao(), \PDO::PARAM_STR);
        $stm->bindValue(2, $leilao->estaFinalizado(), \PDO::PARAM_BOOL);
        $stm->bindValue(3, $leilao->recuperarDataInicio()->format('Y-m-d'));
        $stm->execute();
    }

    /**
     * @return ModelLeilao[]
     */
    public function recuperarNaoFinalizados(): array
    {
        return $this->recuperarLeiloesSeFinalizado(false);
    }

    /**
     * @return ModelLeilao[]
     */
    public function recuperarFinalizados(): array
    {
        return $this->recuperarLeiloesSeFinalizado(true);
    }

    /**
     * @return ModelLeilao[]
     */
    private function recuperarLeiloesSeFinalizado(bool $finalizado): array
    {
        $sql = 'SELECT * FROM leiloes WHERE finalizado = ' . ($finalizado ? 1 : 0);
        $stm = $this->con->query($sql, \PDO::FETCH_ASSOC);

        $dados = $stm->fetchAll();
        $leiloes = [];
        foreach ($dados as $dado) {
            $leilao = new ModelLeilao($dado['descricao'], new \DateTimeImmutable($dado['dataInicio']), $dado['id']);
            if ($dado['finalizado']) {
                $leilao->finaliza();
            }
            $leiloes[] = $leilao;
        }

        return $leiloes;
    }

    public function atualiza(ModelLeilao $leilao)
    {
        $sql = 'UPDATE leiloes SET descricao = :descricao, dataInicio = :dataInicio, finalizado = :finalizado WHERE id = :id';
        $stm = $this->con->prepare($sql);
        $stm->bindValue(':descricao', $leilao->recuperarDescricao());
        $stm->bindValue(':dataInicio', $leilao->recuperarDataInicio()->format('Y-m-d'));
        $stm->bindValue(':finalizado', $leilao->estaFinalizado(), \PDO::PARAM_BOOL);
        $stm->bindValue(':id', $leilao->recuperarId(), \PDO::PARAM_INT);
        $stm->execute();
    }
}

Ao executar o comando vendor/bin/phpunit o seguinte aparece no terminal:

$ vendor/bin/phpunit
PHPUnit 8.1.5 by Sebastian Bergmann and contributors.

...............                                                   15 / 15 (100%)string(18) "blablabla conexão"


Time: 113 ms, Memory: 4.00 MB

OK (15 tests, 29 assertions)

De acordo com o conteúdo do vídeo, isso não deveria acontecer. Por conta disso, ao executar o conteúdo da próxima aula o programa para de funcionar. O que pode ter acontecido para ele estar executando o __construct() ?

1 resposta

PROBLEMA RESOLVIDO

Percebi que no método encerra() do arquivo Service/Encerrador.php existia uma instância de LeilaoDao() que não havia sido removida em uma das aulas anteriores:

public function encerra()
    {
        $dao = new LeilaoDao();
        $leiloes = $this->dao->recuperarNaoFinalizados();

        foreach ($leiloes as $leilao) {
            if ($leilao->temMaisDeUmaSemana()) {
                $leilao->finaliza();
                $this->dao->atualiza($leilao);
            }
        }
    }

Ao remover a instância de LeilaoDao() a ferramenta rodou perfeitamente:

$ vendor/bin/phpunit
PHPUnit 8.1.5 by Sebastian Bergmann and contributors.

...............                                                   15 / 15 (100%)

Time: 101 ms, Memory: 4.00 MB

OK (15 tests, 29 assertions)