1
resposta

[Dúvida] Testes com Exceptions personalizadas

Estou tentando testar se meu código retorna uma Exception personalizada, dentro do meu código. Como vimos no curso de tratamento de erros, podemos criar classes filhas de Exception e personalizar regras para disparo de erros. Segue o código da minha classe Exception:

class InsuffcientBalance(Exception):
    message_default = "saldo insuficiente para operação"

    def __init__(self, message_user = ""):
        self.message = message_user or self.message_default

        super(InsuffcientBalance, self).__init__(self.message)

Quando eu vou testar um método de saque num objeto conta corrente (CheckingAccount) minha aplicação tem que disparar um erro de saldo insuficiente (InsufficientBalance) se o valor do saque for maoir que o saldo da conta.

Porém quando eu executo o teste unitário dessa condição, o código do teste falha:

    def test_when_withdraw_greater_than_balance_returns_insufficient_balance_error(self):
        with pytest.raises(InsuffcientBalance): 
            client = Client(1, 'Maercio')
            agency = Agency(1)
            checking_account = CheckingAccount(client, agency)
            # initial balance equal a zero
            input_value_withdraw = 50

            assert checking_account.withdraw(input_value_withdraw)

print da tela do erroMas quando eu uso o método pytest,raises, recebendo, como parâmetro, uma classe Exception, genérica, o teste funciona normalmente:

    def test_when_withdraw_greater_than_balance_returns_insufficient_balance_error(self):
        with pytest.raises(Exception):
            client = Client(1, 'Maercio')
            agency = Agency(1)
            checking_account = CheckingAccount(client, agency)
            # initial balance equal a zero
            input_value_withdraw = 50

            assert checking_account.withdraw(input_value_withdraw)

print da execução do teste com sucesso

Minha dúvida é? o método pytest.raises sempre vai receber a classe Exception, como parâmetro ? como eu posso testar se minha classe Exceptiom personalizada está sendo executada como esperado?

1 resposta

Olá Maercio, tudo bem com você?

Peço desculpas pela demora em lhe responder.

Com base na mensagem de erro apresentada, o teste pode não está passando ao utilizar a Exception personalizada (InsuffcientBalance) devido ao retorno da função withdraw(), está retornando None e não está ocorrendo a elevação da exceção personalizada.

Peço que verifique se no método withdraw da classe CheckingAccount está ocorrendo a elevação da Exception personalizada. Como no exemplo abaixo, que eleva a exceção InsuffcientBalance quando ocorre a tentativa de saque de um valor maior que o saldo.

def withdraw(self, value):
    if self.client.balance >= value:
        self.client.balance -= value
        return True
    else:
        raise InsuffcientBalance

Após isso, salve o arquivo, realize uma nova execução do teste.

class TesteClass:
    def test_when_withdraw_greater_than_balance_returns_insufficient_balance_error(self):
        with pytest.raises(InsuffcientBalance):
            client = Client(1, 'Maercio')
            agency = Agency(1)
            checking_account = CheckingAccount(client, agency)
            # initial balance equal a zero
            input_value_withdraw = 50

            assert checking_account.withdraw(input_value_withdraw)

Resultado

tests/test_forum.py::TesteClass::test_when_withdraw_greater_than_balance_returns_insufficient_balance_error PASSED                                                               [100%]

Espero ter lhe ajudado. Em caso de dúvidas estou à disposição.

Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Abraços e bons estudos!

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