Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Construtor em teste e IDisposable

Eu não entendi bem como funciona esse esquema do construtor e do IDisposable, não sei se eu também fiz a modificação certa na minha classe.

Só o QuandoArquivoExistenteDeveRetornarUmaListaDePets() passou, os outros não.

using Alura.Adopet.Console.Modelos;
using Alura.Adopet.Console.Util;

namespace Alura.Adopet.Testes;

public class LeitorDeArquivoTeste : IDisposable
{
    private string caminhoArquivo;
    public LeitorDeArquivoTeste()
    {
        //Setup
        string linha = "456b24f4-19e2-4423-845d-4a80e8854a41;Lima Limão;1";
        File.WriteAllText("lista.csv", linha);
        caminhoArquivo = Path.GetFullPath("lista.csv");
    }

    [Fact]
    public void QuandoArquivoExistenteDeveRetornarUmaListaDePets()
    {
        //Arrange            
        //Act
        var listaDePets = new LeitorDeArquivo(caminhoArquivo).RealizaLeitura()!;
        //Assert
        Assert.NotNull(listaDePets);
        Assert.Single(listaDePets);
        Assert.IsType<List<Pet>?>(listaDePets);
    }

    [Fact]
    public void QuandoArquivoNaoExistenteDeveRetornarNulo()
    {
        //Arrange            
        //Act
        var listaDePets = new LeitorDeArquivo("").RealizaLeitura();
        //Assert
        Assert.Null(listaDePets);
    }

    [Fact]
    public void QuandoArquivoForNuloDeveRetornarNulo()
    {
        //Arrange            
        //Act
        var listaDePets = new LeitorDeArquivo(null).RealizaLeitura();
        //Assert
        Assert.Null(listaDePets);
    }

    public void Dispose()
    {
        //ClearDown
        File.Delete(caminhoArquivo);
    }
}

Classe

using Alura.Adopet.Console.Modelos;

namespace Alura.Adopet.Console.Util;

public class LeitorDeArquivo
{
    private readonly string _caminhoDoArquivo;
    public LeitorDeArquivo(string? caminhoDoArquivo = "")
    {
        _caminhoDoArquivo = caminhoDoArquivo!;
    }

    public List<Pet> RealizaLeitura()
    {
        if(_caminhoDoArquivo == null || _caminhoDoArquivo.Trim() == "")
        {
            throw new Exception("Caminho do arquivo não pode ser nulo ou vazio.");
        }
        List<Pet> listaDePets = new List<Pet>();
        using (StreamReader sr = new StreamReader(_caminhoDoArquivo))
        {
            System.Console.WriteLine("----- Serão importados os dados abaixo -----");
            while (!sr.EndOfStream)
            {
                var linha = sr.ReadLine()!;
                var pet = linha.ConverteDoTexto();
                listaDePets.Add(pet);
            }
        }
        
        return listaDePets;
    }
}

/*
 * Documentação de diretrizes para coleções:
 * https://learn.microsoft.com/pt-br/dotnet/standard/design-guidelines/guidelines-for-collections
 */
2 respostas
solução!

Oi Igor! Tudo bem?

O construtor da sua classe de teste LeitorDeArquivoTeste está sendo usado para configurar o ambiente antes de cada teste. No seu caso, você está criando um arquivo CSV com dados de exemplo. Isso é uma prática comum para garantir que cada teste comece com o mesmo estado inicial.

Implementar IDisposable na sua classe de teste é uma maneira de garantir que qualquer recurso que você aloque durante os testes seja liberado corretamente. No seu caso, você está usando o método Dispose para deletar o arquivo CSV após os testes serem executados. Isso ajuda a evitar que arquivos antigos interfiram em execuções futuras dos testes.

Pelo que você descreveu, apenas o teste QuandoArquivoExistenteDeveRetornarUmaListaDePets está passando. Vamos analisar os outros:

  1. QuandoArquivoNaoExistenteDeveRetornarNulo: Este teste está falhando porque a sua implementação atual da classe LeitorDeArquivo lança uma exceção se o caminho do arquivo for nulo ou vazio. Para que o teste passe, você pode ajustar a implementação para retornar nulo em vez de lançar uma exceção quando o caminho for inválido.

  2. QuandoArquivoForNuloDeveRetornarNulo: O mesmo problema ocorre aqui. A exceção é lançada quando o caminho é nulo. Você pode modificar a lógica para retornar nulo em vez de lançar uma exceção.

Sugestão de Ajuste na Classe LeitorDeArquivo

Você pode ajustar o método RealizaLeitura para lidar com caminhos nulos ou vazios da seguinte forma:

public List<Pet>? RealizaLeitura()
{
    if (string.IsNullOrWhiteSpace(_caminhoDoArquivo))
    {
        return null;
    }

    List<Pet> listaDePets = new List<Pet>();
    using (StreamReader sr = new StreamReader(_caminhoDoArquivo))
    {
        System.Console.WriteLine("----- Serão importados os dados abaixo -----");
        while (!sr.EndOfStream)
        {
            var linha = sr.ReadLine()!;
            var pet = linha.ConverteDoTexto();
            listaDePets.Add(pet);
        }
    }
    
    return listaDePets;
}

Com essa modificação, os testes que esperam um retorno nulo devem passar, pois agora a função retorna nulo quando o caminho do arquivo é inválido.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Muito obrigado, agora eu entendi o porque usar o IDisposable e o método Dispose.

public void Dispose()
{
    //ClearDown
    File.Delete(caminhoArquivo);
}