1
resposta

Problema com o assertRaises

Boa tarde, estou tendo problema com o seguinte código

from unittest import TestCase

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


class TestLeilao(TestCase):

    def setUp(self):
        self.gui = Usuario("Gui",500.0)
        self.yago = Usuario("Yago",500.0)

        self.lance_gui = Lance(self.gui, 100.0)
        self.lance_yago = Lance(self.yago, 200.0)

        self.leilao = Leilao("Celular")

    def test_deve_retornar_o_maior_e_o_menor_valor_de_um_lance_quando_adicionado_em_ordem_crescente(self):
        self.leilao.propor(self.lance_gui)
        self.leilao.propor(self.lance_yago)

        menor_valor_esperado = 100.0
        maior_valor_esperado = 200.0

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

    def test_nao_propor_um_lance_em_ordem_decrescente(self):
        with self.assertRaises(LanceInvalido):
            self.leilao.propor(self.lance_yago)
            self.leilao.propor(self.lance_gui)

            menor_valor_esperado = 100.0
            maior_valor_esperado = 200.0


    def test_deve_retornar_o_mesmo_valor_quando_o_leilao_tiver_1_lance(self):
        self.leilao.propor(self.lance_gui)

        self.assertEqual(100.0,self.leilao.menor_lance)
        self.assertEqual(100.0,self.leilao.maior_lance)

    def test_deve_retornar_o_maior_e_o_menor_valor_quando_o_leilao_tiver_3_usurario(self):
        roberto = Usuario("Robert",500.0)
        self.lance_robert = Lance(roberto,300.0)

        self.leilao.propor(self.lance_gui)
        self.leilao.propor(self.lance_yago)
        self.leilao.propor(self.lance_robert)


        menor_valor_esperado = 100.0
        maior_valor_esperado = 300.0

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


    def test_deve_permitir_lances_caso_o_leilao_nao_tenha_lance(self):
        self.leilao.propor(self.lance_gui)
        qtd_lances = len(self.leilao.lances)
        self.assertEqual(1,qtd_lances)


    def test_deve_permitir_o_usuario_fazer_um_lance_caso_o_ultimo_lance_seja_de_outro_usuario(self):
        yuri = Usuario('Yuri',500.0)
        lance_yuri = Lance(yuri,300.0)

        self.leilao.propor(self.lance_gui)
        self.leilao.propor(lance_yuri)

        qtd_lances = len(self.leilao.lances)
        self.assertEqual(2,qtd_lances)


    def test_nao_deve_permitir_usuario_de_fazer_um_lance_caso_o_mesmo_tenha_feito_um_lance_seguido(self):

        with self.assertRaises(LanceInvalido):
            self.leilao.propor(self.lance_gui)
            self.leilao.propor(Lance(self.gui, 450.0))

Nos testes test_nao_propor_um_lance_em_ordem_decrescente e test_nao_deve_permitir_usuario_de_fazer_um_lance_caso_o_mesmo_tenha_feito_um_lance_seguido, está dando como erro: AssertionError: LanceInvalido not raised.

E no test_deve_retornar_o_mesmo_valor_quando_o_leilao_tiver_1_lance, esta dando AssertionError: 100.0 != 0.0.

Eu não sei o que eu poderia fazer pra corrigir.

1 resposta

Olá Yago, tudo bem com você?

Peço desculpas pela demora em lhe responder.

Realizando alguns testes com o código apresentado, verifiquei que os códigos do arquivo de teste estão funcionando corretamente, os erros apresentados podem estar relacionados com o código do arquivo dominio.py.

Realizando a simulação dos erros apresentados, temos os seguintes pontos para verificação.

Para o teste: test_nao_propor_um_lance_em_ordem_decrescente

O a mensagem de falha de teste aparece devido não ter sido levantado o erro LanceInvalido, peço que verifique o método _valor_maior_que_lance_anterior da classe Leilao, nele deverá conter o levantamento do erro através do raise, este método deverá estar conforme abaixo:

def _valor_maior_que_lance_anterior(self, lance):
    if lance.valor > self.__lances[-1].valor:
        return True
    raise LanceInvalido('O Valor do lance deve ser maior que o do lance anterior')

Para o teste: test_nao_deve_permitir_usuario_de_fazer_um_lance_caso_o_mesmo_tenha_feito_um_lance_seguido

Assim como no anterior, o teste falha devido não ser levantado o erro LanceInvalido, peço que verifiquei o método _usuarios_diferentes da classe Leilao, deverá estar conforme abaixo:

def _usuarios_diferentes(self, lance):
    if self.__lances[-1].usuario != lance.usuario:
        return True
    raise LanceInvalido('O mesmo usuário não pode dar dois lances seguidos')

Para o teste: test_deve_retornar_o_mesmo_valor_quando_o_leilao_tiver_1_lance

O teste está falando devido o valor salvo como maior ou menor ser zero (0) o que indica a possibilidade de o lance não está sendo declarado (salvo) nas variáveis, peço que verifique o método propor da classe Leilao, verifique se está ocorrendo a declaração dos lances nos atributos menor_lance e maior_lance, como apresentado abaixo.

def propor(self, lance: Lance):
    if self._lance_e_valido(lance):
        if not self._tem_lances():

            self.menor_lance = lance.valor
        self.maior_lance = lance.valor

        self.__lances.append(lance)

Os testes acima foram realizados com o uso do código utilizado nas aulas, peço que verifique os pontos propostos de mudanças, caso a falha dos testes continue, peço que envie o código completo dos arquivos dominio.py e LanceInvalido.py para que sejam realizados os testes em conjunto com os demais arquivos.

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!