2
respostas

Erro ao criar um banco de dados em memória

Boa noite

Eu estou tendo alguns problemas ao executar este teste:

<?php

namespace Tests\Feature;

use App\Serie;
use App\Services\CriadorDeSerie;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class CriadorDeSerieTest extends TestCase
{
    use RefreshDatabase;

    public function testCriarSerie()
    {
        $criadorDeSerie = new CriadorDeSerie();
        $nomeDaSerie = 'Nome de teste';
        $serie = $criadorDeSerie->criarSerie($nomeDaSerie, 1, 1);

        $this->assertInstanceOf(Serie::class, $serie);
        $this->assertDatabaseHas('series', ['nome' => $nomeDaSerie]);
        $this->assertDatabaseHas('temporadas', ['serie_id' => $serie->id, 'numero_temporada' => 1]);
        $this->assertDatabaseHas('episodios', ['numero_episodio' => 1]);
    }
}

O arquivo .env.testing:

DB_CONNECTION=sqlite
DB_DATABASE=:memory:

Mensagem do erro:

PHPUnit 7.5.20 by Sebastian Bergmann and contributors.

F..                                                                 3 / 3 (100%)

Time: 358 ms, Memory: 20.00 MB

There was 1 failure:

1) Tests\Feature\CriadorDeSerieTest::testCriarSerie
Failed asserting that a row in the table [episodios] matches the attributes {
    "numero_episodio": 1
}.

The table is empty.

I:\arquivos\cursos\laravel\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithDatabase.php:24
I:\arquivos\cursos\laravel\tests\Unit\CriadorDeSerieTest.php:24

FAILURES!
Tests: 3, Assertions: 8, Failures: 1.
2 respostas

Olá, Leonardo. Como está implementada sua classe que cria a série?

Aparentemente o erro é só na inserção dos episódios...

Eu estava tendo exatamente o mesmo erro. Descobri que o problema era na criação dos episódios:

private function criaEpisodios(int $epPorTemporada, Temporada $temporada): void
    {
        for ($j = 1; $j < $epPorTemporada; $j++) {
            $temporada->episodios()->create(['numero' => $j]);
        }
    }

O criador de séries estava criando as temporadas com um episódio a menos do que foi solicitado. Apenas troquei a condição do loop para:

$j <= $epPorTemporada

e o teste funcionou