5
respostas

Classe de teste não funciona, embora o erro aconteca na classe princial

# 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

#principal.py
from  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 usuario {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}')

#test_dominio.py
from unittest import TestCase
from dominio import Usuario, Lance, Leilao


class TestAvaliador(TestCase):
    def test_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)
5 respostas

Oi Emerson, tudo bem?

Esse erro está ocorrendo por causa do seguinte trecho no arquivo dominio.py:

    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

Ao invés de utilizar o elif, se faz necessário o uso do if, pois ao utilizar o elif apenas uma das condições será satisfeita.

Altere para:

    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

Qualquer dúvida estou por aqui.

Abraços e bons estudos!

Prezada, ja tinha colocado com o IF no lugar do ELIF, tambem náo funciona. Alias, o erro acontece quando rodo a rotina da classe Principal, mas náo acontece quando executa a classe de testes. Tambem notei que nao aparece para mim a janela dos erros, como a do instrutor.

Uso Windows 10 e Pycharm

Emerson, poderia especificar melhor qual erro está ocorrendo quando você executa o arquivo principal.py?

Ao executar o seu código após a mudança que mencionei, obtenho o resultado esperado:

image

Fico no seu aguardo.

Se voce inverter as linhas abaixo, aparece o bug. mas somente na classe principal.py. Na classe de teste nao aconterce. Eu posso mandar um print da tela ?

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

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

Pode mandar um print sim, Emerson. Poste o print no Imgur e deixe o link na resposta =)