1
resposta

Problema com o Try e With

Pessoal, criei um cenário de teste com 4 lances e dois usuários. Segue abaixo os códigos:

EM DOMÍNIO

class Leilao:

def __init__(self, descricao):
    self.descricao = descricao
    self.__lances = []
    self.maior_valor = sys.float_info.min
    self.menor_valor = sys.float_info.max

def propoe(self, lance : Lance):
    if not self.__lances or self.__lances[-1].usuario != lance.usuario and lance.valor > self.__lances[-1].valor:
        if self.maior_valor < lance.valor:
            self.maior_valor = lance.valor
        if self.menor_valor > lance.valor:
            self.menor_valor = lance.valor

        self.__lances.append(lance)
    else:
        raise ValueError('Erro ao propor lance')

EM TESTE

def setUp(self):
    self.usuario1 = Usuario("Andre")
    self.usuario2 = Usuario("Miguel")
    self.lance1 = Lance(self.usuario1, 100)
    self.lance2 = Lance(self.usuario2, 150)
    self.lance3 = Lance(self.usuario2, 300)
    self.lance4 = Lance(self.usuario1, 350)
    self.leilao = Leilao("Celuar")


def test_nao_deve_permitir_lance_quando_o_usuario_anterior_e_igual_ao_atual_2(self):

    try:
        self.leilao.propoe(self.lance1)
        self.leilao.propoe(self.lance2)
        self.leilao.propoe(self.lance3)
        self.leilao.propoe(self.lance4)
    except ValueError:
        quantidade_de_lances_recebido = len(self.leilao.lances)
        self.assertEqual(3, quantidade_de_lances_recebido)

E ao rodar, o teste me avisa a divergência entre a quantidade de lances recebidas (2) e o esperado (3). Porém, se vocês perceberem a ordem dos lances, apenas o lance3 não poderia ser executado, já que pertence a mesma pessoa do anterior.

Ao executar o mesmo teste, porém retirando o linha da classe leilao,

else: raise ValueError('Erro ao propor lance')

o meu teste retorna que 3 lances foram realizados.

Alguém sabe me dizer porque na 1° tentativa ocorreu essa divergência?

1 resposta

Oi André! Como vai ?

Essa divergência ocorreu porque assim que ocorre uma exceção, ela é lançada.

Recapitulando sobre os valores de variáveis que temos:

    self.lance1 = Lance(self.usuario1, 100)
    self.lance2 = Lance(self.usuario2, 150)
    self.lance3 = Lance(self.usuario2, 300)
    self.lance4 = Lance(self.usuario1, 350)

Então temos o seguinte fluxo:

  • self.leilao.propoe(self.lance1) há alguma exceção ? Não, pois é o primeiro lance

  • self.leilao.propoe(self.lance2) há alguma exceção ? Este lance é igual ao anterior ? Não, então continue o código

  • self.leilao.propoe(self.lance3) há alguma exceção ? Este lance é igual ao anterior ? OPAAA!! Aqui temos um lance igual ao anterior, então, mande uma exceção

Perceba que passamos em 2 casos. Este é um comportamento padrão do try e except; tente executar, mas se algo não ocorrer da forma planejada, pare e vá para o bloco de except.

Pegou a ideia?

Qualquer dúvida estou a disposição. Espero ter ajudado. Bons estudos!!!!