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

Erro ao rodar os testes.

Dá esse erro quando tento rodar os testes do test_Usuario.py

C:\Users\Meg\Documents\testes-python-projeto-inicial\venv\Scripts\python.exe "C:\Users\Meg\Nova pasta\PyCharm Community Edition 2020.3\plugins\python-ce\helpers\pycharm_jb_pytest_runner.py" --path C:/Users/Meg/Documents/testes-python-projeto-inicial/tests/test_Usuario.py Testing started at 16:03 ... Launching pytest with arguments C:/Users/Meg/Documents/testes-python-projeto-inicial/tests/test_Usuario.py in C:\Users\Meg\Documents\testes-python-projeto-inicial\tests

============================= test session starts ============================= platform win32 -- Python 3.9.1, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 -- C:\Users\Meg\Documents\testes-python-projeto-inicial\venv\Scripts\python.exe cachedir: .pytest_cache rootdir: C:\Users\Meg\Documents\testes-python-projeto-inicial\tests collecting ... test_Usuario.py:None (test_Usuario.py) test_Usuario.py:1: in from src.leilao.dominio import Usuario, Leilao ..\src\leilao\dominio.py:1: in class Usuario: ..\src\leilao\dominio.py:11: in Usuario lance = Lance(self, valor) E NameError: name 'Lance' is not defined collected 0 items / 1 error

=================================== ERRORS ==================================== _ ERROR collecting testUsuario.py __ testUsuario.py:1: in from src.leilao.dominio import Usuario, Leilao ..\src\leilao\dominio.py:1: in class Usuario: ..\src\leilao\dominio.py:11: in Usuario lance = Lance(self, valor) E NameError: name 'Lance' is not defined =========================== short test summary info =========================== ERROR test_Usuario.py - NameError: name 'Lance' is not defined !!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!! ============================== 1 error in 1.03s ===============================

Process finished with exit code 2

Assertion failed

Assertion failed

Tais erros são acusados no dominio.py: Unresolved reference 'Lance' Unresolved reference 'self' Unresolved reference 'valor' Unresolved reference 'leilao' Unresolved reference 'self' Unresolved reference 'valor'

no entanto tais classes estão presentes no código, como corrigir isso? desde já obrigado!

4 respostas

Manda um print de como estão as pastas e os arquivos no seu pycharm por favor. Manda tbm o código do dominio.py e do test_Usuario.py.

Olá Luigi, as pastas estão dessa maneira: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Agora os Testes:

dominio.py:

class Usuario:

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

def propoe_lance(self, leilao, valor):
    if self._valor_eh_valido(valor):
        raise ValueError('Não pode propor um lance com o valor maior que o valor da carteira')

lance = Lance(self, valor)
leilao.propoe(lance)

self.__carteira -= valor

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

@property
def carteira(self):
    return self.__carteira

def _valor_eh_valido(self, valor):
    return valor > self.__carteira

class Lance:

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

class Leilao:

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

def propoe(self, lance: Lance):
    if self._lance_eh_valido(lance):
        if not self._tem_lances():
            self.menor_lance = lance.valor

            self.maior_lance = lance.valor

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

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

def _tem_lances(self):
    return self.__lances

def _usuarios_diferentes(self, lance):
    return self.__lances[-1].usuario != lance.usuario

def _valor_maior_que_lance_anterior(self, lance):
    return lance.valor > self.__lances[-1].valor

def _lance_eh_valido(self, lance):
    return not self._tem_lances() or (self._usuarios_diferentes(lance) and
                                      self._valor_maior_que_lance_anterior(lance))

test_Usuario.py:

from src.leilao.dominio import Usuario, Leilao

import pytest

@pytest.fixture

def marston(): return Usuario("Marston", 100.0)

@pytest.fixture

def leilao(): return Leilao("Cavalo")

def test_deve_subtrair_valor_da_carteira_do_usuario_quando_este_propor_um_lance(marston, leilao): marston.propoe_lance(leilao, 50.0)

assert marston.carteira == 50.0

def test_deve_permitir_propor_lance_quando_o_valor_rh_menor_que_o_valor_da_carteira(marston, leilao): marston.propoe_lance(leilao, 1.0)

assert marston.carteira == 99.0

def test_deve_permitir_propor_lance_quando_o_valor_eh_igual_ao_valor_da_carteira(marston, leilao): marston.propoe_lance(leilao, 100.0)

assert marston.carteira == 0.0

def test_nao_deve_permitir_propor_lance_com_valor_maior_que_o_da_carteira(marston, leilao): with pytest.raises(ValueError):

    leilao = Leilao("Cavalo")

    marston.propoe_lance(leilao, 200.0)
solução!

Olhando no teu print aqui, você não indentou corretamente no teu dominio.py na classe Usuario no método propoe_lance.

Está assim:

def propoe_lance(self, leilao, valor):
    if self._valor_eh_valido(valor):
        raise ValueError('Não pode propor um lance com o valor maior que o valor da carteira')

lance = Lance(self, valor)
leilao.propoe(lance)

self.__carteira -= valor

Deveria estar assim:

def propoe_lance(self, leilao, valor):
    if self._valor_eh_valido(valor):
        raise ValueError('Não pode propor um lance com o valor maior que o valor da carteira')
    else:
        lance = Lance(self.__nome, valor)
        leilao.propoe(lance)

        self.__carteira -= valor

Indentei, adicionei o else pra garantir que só vai rodar se o if der False (imaginei que é isso que você queria) e mudei o primeiro parâmetro do Lance pra self.__nome porque imagino que você queira que o lance seja criado no nome do usuario e não no nome da posição que o objeto do usuario está na memória (o que seria parecido com isso <src.leilao.dominio.Leilao object at 0x000001DC85D64190>)

Vê se funciona fazendo só isso, imagino que vá funcionar, se não manda o problema novo e a gente descobre o que é agora :)