4
respostas

[Bug] Estou com um erro ao rodar os testes

There were 2 errors:

1) Alura\Leilao\Tests\Service\EncerradorTest::testLeiloesComMaisDeUmaSemanaDevemSerEncerrados
TypeError: Alura\Leilao\Service\Encerrador::__construct(): Argument #2 ($enviadorEmail) must be of type Alura\Leilao\Tests\Service\EnviadorEmail, Mock_EnviadorEmail_b9a0142d given, called in /home/arthurnmachado/estudos/laravel/leilao/tests/Service/EncerradorTest.php on line 41

/home/arthurnmachado/estudos/laravel/leilao/src/Service/Encerrador.php:12
/home/arthurnmachado/estudos/laravel/leilao/tests/Service/EncerradorTest.php:41

2) Alura\Leilao\Tests\Service\EncerradorTest::testDeveContinuarOProcessamentoAoEncontrarErroAoEnviarEmail
TypeError: Alura\Leilao\Service\Encerrador::__construct(): Argument #2 ($enviadorEmail) must be of type Alura\Leilao\Tests\Service\EnviadorEmail, Mock_EnviadorEmail_b9a0142d given, called in /home/arthurnmachado/estudos/laravel/leilao/tests/Service/EncerradorTest.php on line 41
4 respostas

Olá, tudo bem?

Poderia compatrilhar seu código?

<?php

namespace Alura\Leilao\Tests\Service;

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

class EncerradorTest extends TestCase
{
    private $encerrador;
    /** @var MockObject */
    private $enviadorEmail;
    private $leilaoFiat147;
    private $leilaoVariante;

    protected function setUp(): void
    {
        $this->leilaoFiat147 = new Leilao(
            'Fiat 147 0Km',
            new \DateTimeImmutable('8 days ago')
        );
        $this->leilaoVariante = new Leilao(
            'Variant 1972 0Km',
            new \DateTimeImmutable('10 days ago')
        );
        $leilaoDao = $this->createMock(LeilaoDao::class);
        $leilaoDao->method('recuperarNaoFinalizados')
            ->willReturn([$this->leilaoFiat147, $this->leilaoVariante]);
        $leilaoDao->expects($this->exactly(2))
            ->method('atualiza')
            ->withConsecutive(
                [$this->leilaoFiat147],
                [$this->leilaoVariante]
            );
        $this->enviadorEmail = $this->createMock(EnviadorEmail::class);

        $this->encerrador = new Encerrador($leilaoDao, $this->enviadorEmail);
    }

    public function testLeiloesComMaisDeUmaSemanaDevemSerEncerrados()
    {
        $this->encerrador->encerra();

        $leiloes = [$this->leilaoFiat147, $this->leilaoVariante];
        self::assertCount(2, $leiloes);
        self::assertTrue($leiloes[0]->estaFinalizado());
        self::assertTrue($leiloes[1]->estaFinalizado());
    }

    public function testDeveContinuarOProcessamentoAoEncontrarErroAoEnviarEmail()
    {
        $e = new \DomainException('Erro ao enviar e-mail');
        $this->enviadorEmail->expects($this->exactly(2))
            ->method('notificarTerminoLeilao')
            ->willThrowException($e);

        $this->encerrador->encerra();
    }

Bom dia, Arthur tudo bem?

Parece que há uma inconformidade na construção do objeto Encerrador na linha 41.

$this->encerrador = new Encerrador($leilaoDao, $this->enviadorEmail);

Pode compartilhar o código dessa class Encerrador, por favor?

Att,

class Encerrador
{
    private $dao;

    public function __construct(LeilaoDao $dao, EnviadorEmail $enviadorEmail)
    {
        $this->dao = $dao;
        $this->enviadorEmail = $enviadorEmail;
    }

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

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