Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Teste com tratamento de exceção

Bom dia,

Estou fazendo um exercício que pede:

Faça um Programa que verifique se uma letra digitada é "F", "M" ou "L" conforme a letra escrever: F - Feminino, M - Masculino, L - LGBT ou Opção Inválida.

Dai tranquilo fiz o programa está ai abaixo, minha duvida ficou na hora de fazer o teste quando o usuário digita uma opção invalida no caso uma exceção, fiz o tratamento da exceção direitinho mas não consigo pensar num teste quando o usuário digita uma opção invalida, desde já agradeço pela ajuda.

#Arquivo FemininoMaculinoLgbt.py

from FemininoMaculinoLgbtExececoes import OpcaoInvalida


class FemininoMaculinoLgbt:

    def __init__(self, sexo):
        self.__sexo = sexo
        self.__sexo = self.__sexo.upper()

    def verifica_sexo(self):
        if self.__sexo == "F":
            return "Feminino"
        if self.__sexo == "M":
            return "Masculino"
        if self.__sexo == "L":
            return "LGBT"
        else:
            raise OpcaoInvalida("Opção Invalida")
#Arquivo FemininoMasculinoLgbtMain.py

from FemininoMasculinoLgbt import FemininoMaculinoLgbt

try:
    sexo = input("Digite 'F' para Feminino 'M' para Masculino e 'L' para LGBT: ")
    objeto_feminino_masculino_lgbt = FemininoMaculinoLgbt(sexo)
    opcao_escolhida = objeto_feminino_masculino_lgbt.verifica_sexo()
    print(f"O opção escolhida foi {opcao_escolhida}")

except Exception as error:
    print(error)
#Arquivo TestFemininoMasculinoLgbt.py

from unittest import TestCase
from FemininoMasculinoLgbt import FemininoMaculinoLgbt
from FemininoMaculinoLgbtExececoes import OpcaoInvalida


class TestFemininoMaculinoLgbt(TestCase):

    def test_deve_passar_quando_escolha_feminino(self):
        feminino = "f"
        resultado_esperado = "Feminino"
        objeto_feminino_masculino_lgbt = FemininoMaculinoLgbt(feminino)
        opcao_escolhida = objeto_feminino_masculino_lgbt.verifica_sexo()
        assert opcao_escolhida == resultado_esperado

    def test_deve_passa_quando_escolha_masculino(self):
        masculino = "m"
        resultado_esperado = "Masculino"
        objeto_feminino_masculino_lgbt = FemininoMaculinoLgbt(masculino)
        opcao_escolhida = objeto_feminino_masculino_lgbt.verifica_sexo()
        assert opcao_escolhida == resultado_esperado

    def test_deve_passa_quando_escolha_lgbt(self):
        lgbt = "l"
        resultado_esperado = "LGBT"
        objeto_feminino_masculino_lgbt = FemininoMaculinoLgbt(lgbt)
        opcao_escolhida = objeto_feminino_masculino_lgbt.verifica_sexo()
        assert opcao_escolhida == resultado_esperado

    def test_deve_passa_quando_opcao_invalida(self):
        pass
#Arquivo FemininoMasculinoLgbtExcecoes.py

class OpcaoInvalida(Exception):
    pass
1 resposta
solução!

Grande Igor! Como você está? Espero que esteja bem =)

Para capturar essa exceção de OpcaoInvalida podemos utilizar o gerenciador de contexto with juntamente com o assertRaises, com isso dizemos ao nosso teste que esperamos que a exceção passada como parâmetro no assertRaises seja lançada quando um determinado método for executado dentro do with. Veja:

    def test_deve_passa_quando_opcao_invalida(self):
        opcao_invalida = "k"

        with self.assertRaises(OpcaoInvalida):
            FemininoMaculinoLgbt(opcao_invalida).verifica_sexo()

E caso passássemos algum parâmetro para a classe FemininoMaculinoLgbt que não gerasse a exceção que estamos esperando, o nosso teste falharia. Como por exemplo:

    def test_deve_passa_quando_opcao_invalida(self):
        opcao_invalida = "l"

        with self.assertRaises(OpcaoInvalida):
            FemininoMaculinoLgbt(opcao_invalida).verifica_sexo()

Qualquer dúvida estou por aqui.

Abraços e bons estudos!