1
resposta

[Bug] (Resolução) Exceção não lançada -> TestaExcecaoConsultaPorAgenciaPorId()

Bom dia / Boa tarde / Boa noite,

Post para auxiliar na resolução do "bug" no método "TestaExcecaoConsultaPorAgenciaPorId()".

Ao executar o método "TestaExcecaoConsultaPorAgenciaPorId()" eu não estava recebendo nenhuma exceção:

        [Fact]
        public void TestaExcecaoConsultaPorAgenciaPorId()
        {
            //Act
            //Assert
            Assert.Throws<FormatException>(
                () => _repositorio.ObterPorId(33)
            );
        }

Realizei uma pequena investigação e percebi que no método "ObterPorId()" na classe "AgenciaRepositorio" retornava um valor nulo e não chegava a lançar uma FormatException:

        public Agencia ObterPorId(int id)
        {
            try
            {
                var agencia = _contexto.Agencias.FirstOrDefault(p => p.Id == id);
                if(agencia == null)
                {
                    return null;
                }
                return agencia;
            }
            catch (Exception ex)
            {
               throw new Exception($"Erro ao obter agência com Id = {id}.") ;
            }
        }

Alterei o mesmo para que não retornasse mais um "null" e sim uma FormatException. Também foi necessário adicionar um novo bloco try-catch para que capturasse a exceção e a lançasse novamente (fiz isso pois se retornasse "null", o 'erro' persistiria). Ficou assim:


        public Agencia ObterPorId(int id)
        {
            try
            {
                var agencia = _contexto.Agencias.FirstOrDefault(p => p.Id == id);
                if(agencia == null)
                {
                    //return null;
                    throw new FormatException($"Erro ao obter a agência informado com o ID = {id}");
                }
                return agencia;
            }
            catch (FormatException ex0)
            {
                    throw new FormatException($"Erro ao obter a agência informado com o ID = {id}");
            }
            catch (Exception ex1)
            {
               throw new Exception($"Erro ao obter agência com Id = {id}.") ;
            }
        }

Após esse ajuste o teste começou a retornar o resultado esperado (uma FormatException). Espero que este post tenha auxiliado alguém com este mesmo erro.

1 resposta

Olá, Gustavo!

Obrigada por compartilhar sua solução com a comunidade. Realmente, o método "ObterPorId()" estava configurado para retornar null quando não encontrava a agência, e não uma exceção do tipo FormatException, como o teste estava esperando.

Para esclarecer para quem está lendo: o método de teste "TestaExcecaoConsultaPorAgenciaPorId()" estava configurado para esperar uma exceção do tipo FormatException ao chamar o método "ObterPorId()" com um ID que não existe no banco de dados. Porém, o método "ObterPorId()" estava configurado para retornar null, e não uma exceção, quando a agência não era encontrada.

A solução do Gustavo foi modificar o método "ObterPorId()" para lançar uma exceção do tipo FormatException quando a agência não é encontrada. Assim, o teste passou a funcionar como esperado.

Lembrando que, em um cenário real, é importante discutir com a equipe se essa é a melhor solução. Em alguns casos, pode ser mais apropriado que o método "ObterPorId()" retorne null quando a agência não é encontrada, e o teste seja modificado para esperar esse comportamento.

Espero ter ajudado e bons estudos!