Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Classe de teste não retorna erro como deveria

Esse código deveria retornar um erro já que o lance do yuri está sendo calculado errado, mesmo com o erro corrigido tbm não é retornado um ok.

test_avaliador.py


from unittest import TestCase
from src.leilao.dominio import Usuario, Lance, Leilao, Avaliador


class TestAvaliador(TestCase):

    def teste_avalia(self):

        gui = Usuario('Gui')
        yuri = Usuario('Yuri')

        lance_do_yuri = Lance(yuri, 100.0)
        lance_do_gui = Lance(gui, 150.0)

        leilao = Leilao('Celular')

        leilao.lances.append(lance_do_yuri)
        leilao.lances.append(lance_do_gui)

        avaliador = Avaliador()
        avaliador.avalia(leilao)

        menor_valor_esperado = 100.0
        maior_valor_esperado = 150.0

        self.assertEqual(menor_valor_esperado, avaliador.menor_lance)
        self.assertEqual(maior_valor_esperado, avaliador.maior_lance)

principal.py

from src.leilao.dominio import Usuario, Lance, Leilao, Avaliador

gui = Usuario('Gui')
yuri = Usuario('Yuri')

lance_do_yuri = Lance(yuri, 100.0)
lance_do_gui = Lance(gui, 150.0)

leilao = Leilao('Celular')

leilao.lances.append(lance_do_yuri)
leilao.lances.append(lance_do_gui)

for lance in leilao.lances:
    print(f'O usuário {lance.usuario.nome} deu um lance de {lance.valor}')

avaliador = Avaliador()
avaliador.avalia(leilao)

print(f'O menor lance foi de {avaliador.menor_lance} e o maior lance foi de {avaliador.maior_lance}')

dominio.py

import sys

class Usuario:

    def __init__(self, nome):
        self.__nome = nome

    @property
    def nome(self):
        return self.__nome


class Lance:

    def __init__(self, usuario, valor):
        self.usuario = usuario
        self.valor = valor


class Leilao:

    def __init__(self, descricao):
        self.descricao = descricao
        self.__lances = []

    @property
    def lances(self):
        return self.__lances


class Avaliador:

    def __init__(self):
        self.maior_lance = sys.float_info.min
        self.menor_lance = sys.float_info.max

    def avalia(self, leilao: Leilao):

        for lance in leilao.lances:
            if lance.valor > self.maior_lance:
                self.maior_lance = lance.valor
            elif lance.valor < self.menor_lance:
                self.menor_lance = lance.valor
3 respostas

Oi Alamyr, como você está? Espero que esteja bem ^-^

Não entendi muito bem sua dúvida, executei seu código e o erro ocorre quando executamos o teste_avalia. Seria esse o erro no qual você está se referindo?

Se sim, isso está ocorrendo por causa da cláusula elif no método avalia da classe Avaliador, pois usando esse comando a variável menor_lance só será atribuída se a primeira condição if for falsa e a condição do elif for verdadeira, mas caso o código entre no primeiro if, o elif não será nem testado.

Para corrigir isso, temos que utilizar o if ao invés do elif para que o código faça o teste independente se a primeira condição for verdadeira ou não, veja:


class Avaliador:

    def __init__(self):
        self.maior_lance = sys.float_info.min
        self.menor_lance = sys.float_info.max

    def avalia(self, leilao: Leilao):

        for lance in leilao.lances:
            if lance.valor > self.maior_lance:
                self.maior_lance = lance.valor
            if lance.valor < self.menor_lance:
                self.menor_lance = lance.valor

Caso não seja essa sua dúvida, detalhe melhor para que possamos te ajudar. Estou por aqui, tá bom?

Abraços e bons estudos!

Oi Nádia, Obrigado pela ajuda, minha dúvida é como eu faço para o erro aparecer no log, no vídeo ele ensina a consertar o erro também mudando o elif porém o objetivo do vídeo em questão é conseguir registrar o erro no teste avalia quando ele acontecer, se o resultado for diferente do esperado. No meu código esse log de erro não aparece para mim.

solução!

Depois de quebrar muito a cabeça resolvi. Precisava simplesmente fazer o unittests aparecer na tela quando rodado. É só clicar com o botão direito no código ir em edit unittests e clicar no checkbox show this page. Espero que ajude alguém o/