1
resposta

Lógica da aula

Olá, não consegui muito bem entender a lógica dessa aula, mais especificamente a partir do momento em que se fala sobre a utilização da exceção. Desse ponto em diante, não captei muito bem o que estava sendo feito.

Agradeço qualquer tentativa de explicação.

1 resposta

Olá Gustavo, tudo bem com você?

Peço desculpas pela demora em lhe responder.

No Python temos a cláusula try (em português: tente) e a cláusula except (em português: exceto). Essas cláusulas trabalham em conjunto, onde será feita a tentativa (try) de execução de um bloco de código exceto (except) quando uma condição for atingida, na atividade da aula, o bloco de código presente no try será executado exceto quando for levantado o erro de valor (ValueError).

Recapitulando o conteúdo do arquivo dominio.py, nele temos a validação da proposta do usuário, essa validação está na classe leilao, método propoe; onde, caso um usuário tente dar dois lances seguidos será levantado (raise) o erro de valor (ValueError).

Método propoe

def propoe(self, lance: Lance):
    if not self.__lances or self.__lances[-1].usuario != lance.usuario
        if lance.valor > self.maior_lance:
            self.maior_lance = lance.valor
        if lance.valor < self.menor_lance:
            self.menor_lance = lance.valor
        self.__lances.append(lance)
    else:
        raise ValueError('Erro ao propor lance')

Em nosso arquivo de teste test_leilao.py temos o teste que verifica se um mesmo usuário deu dois lances seguidos, nesse teste fazemos o uso das cláusulas try e except, onde irá realizar a tentativa de propor dois lances seguidos pelo mesmo usuário, essa tentativa deve ser feita exceto quando for levantado o erro de valor (ValueError).

Teste

def test_nao_deve_permitir_propor_lace_caso_o_usuario_seja_o_mesmo(self):
    lance_do_gui200 = Lance(self.gui, 200.0)

    try:
        self.leilao.propoe(self.lance_do_gui)
        self.leilao.propoe(lance_do_gui200)
    except ValueError:
        quantidade_de_lances_recebido = len(self.leilao.lances)
        self.assertEqual(1, quantidade_de_lances_recebido)

Note que no teste acima estamos fazendo duas propostas com o mesmo usuário no bloco de código try. Em nossa classe Leilao foi implementado no método propoe o impeditivo de propostas seguidas pelo mesmo usuário, assim será levantado o erro de valor, levando a execução do teste para o bloco except, onde será verificado se a quantidade de lance salvo é um (1), no nosso exemplo será, já que o segundo lance não será aceito por ser do mesmo usuário, assim o teste passará.

Os códigos acima foram utilizados até o minuto 8 da aula, após esse tempo é realizado uma refatoração do código, onde é realizado a mudança do código do teste mantendo seu objetivo, verificar se é levantado o erro de valor (ValueError).

Código do teste após refatoração

    def test_nao_deve_permitir_propor_lace_caso_o_usuario_seja_o_mesmo(self):
        lance_do_gui200 = Lance(self.gui, 200.0)

        with self.assertRaises(ValueError):
            self.leilao.propoe(self.lance_do_gui)
            self.leilao.propoe(lance_do_gui200)

No código de teste acima é utilizado a cláusula with (em português: com) para informar as propostas dos usuários, usando essa cláusula é informado que o bloco deverá ser executado com (with) o módulo self.assertRaises herdado da classe TestCase, usando esse módulo podemos informar qual erro esperamos que seja levantado, nesse exemplo deverá esperar que seja levantado o erro de valor.

Em resumo temos:

  • Antes da refatoração do código, nosso teste espera que seja levantado um erro de valor (ValueError), após o erro ser levantado é realizado uma verificação através exceção (except), verificando assim se o comprimento da lista é igual a 1, caso seja o teste passará.

  • No segundo momento após nossa refatoração do código, o teste realizará apenas a verificação se é levantado o erro de valor, essa verificação ocorre com o uso do método self.assertRaises, quando é feita a tentativa de propostas iguais.

  • Nossos testes apresentaram falhas quando o erro não for levantado, seja por informarmos usuários diferentes ou por não ter sido implementado o levantamento do erro, algo que o professor simula no minuto 5:50 da aula.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

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