Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

consulta de test de unidad #45

Open
SantiClausen opened this issue May 25, 2018 · 68 comments
Open

consulta de test de unidad #45

SantiClausen opened this issue May 25, 2018 · 68 comments
Labels
question Further information is requested

Comments

@SantiClausen
Copy link

no recuerdo muy bien, y no he tenido suerte en encontrarlo en internet, ¿como era que podía hacer el test de unidad a una clase que se encuentra en un archivo separado al archivo donde se hace el test de unidad?

@RodrigoJacznik
Copy link
Contributor

Que test queres realizar?

Con lo que ya esta en el archivo test_unit.py creo que podes hacer los test que pedimos en la actividad.

@SantiClausen
Copy link
Author

disculpe, ahi logre ubicarme mejor. Pero ahora tengo un problema distinto; quiero hacer un test de unidad, pero me salio un error:
Traceback (most recent call last):
File "test_unit.py", line 7, in
from app import create_app, db
ModuleNotFoundError: No module named 'app'

por curiosidad, hice un test al test_unit.py para ver si no yo borre algo, y me salio el mismo problema

@RodrigoJacznik
Copy link
Contributor

RodrigoJacznik commented May 25, 2018

como estas corriendo los test?
Deberías correrlos con pytest desde la carpeta raíz del proyecto

@RodrigoJacznik RodrigoJacznik added the question Further information is requested label May 25, 2018
@SantiClausen
Copy link
Author

SantiClausen commented May 25, 2018

python [nombre del archivo], lo hago dentro del git bash. ¿Acaso se deben hacer en la consola de windows?

@RodrigoJacznik
Copy link
Contributor

RodrigoJacznik commented May 25, 2018

No, como se mostró en clase, con el comando pytest desde la carpeta raíz del proyecto

@SantiClausen
Copy link
Author

ahi logre correr el test_unit bien, pero a la ves, el test que cree yo me salio con un monto de información y, parece que fallo, pero no de la forma que esperaba

@RodrigoJacznik
Copy link
Contributor

Pasame la salida del comando así te puedo dar una mano

@SantiClausen
Copy link
Author

es muy largo, asi que le paso esto:
https://pastebin.com/KHR2Ux4G

lo que intente hacer era verificar si el orderproduct podía reconocer una entrada con cantidad negativa y denegarla por eso

@RodrigoJacznik
Copy link
Contributor

Los test escribilos en el archivo test_unit.py, no hagas otro archivo así evitamos problemas de setup

@SantiClausen
Copy link
Author

SantiClausen commented May 25, 2018

ah, ok. Pero parece que el pytest no me quiere tomar el test que le hago:
image
image
tendria que have tres, con el tercero siendo rechazado

@RodrigoJacznik
Copy link
Contributor

Es que no tenes que crear una nueva clase de python, como se dijo en clase, lo único que tienen que hacer es crear un método dentro de la clase que ya existe, similar al método test_crear_producto.

@SantiClausen
Copy link
Author

pero el ejercicio me pide verificar una clase especifica. ¿Debo llamar a esa clase dentro del método que escribo?

@RodrigoJacznik
Copy link
Contributor

Cual es el enunciado?

@SantiClausen
Copy link
Author

"Hacer un test de unidad para verificar que no se pueda crear una instancia de la clase OrderProduct si el atributo quantity es un entero negativo."

@RodrigoJacznik
Copy link
Contributor

Bueno, el test deberia ser algo asi:

def test_create_order_product_with_negative_quantity(self):
    # Codigo de test

Y dentro de ese método probas crear una instancia de OrderProduct (la clase que ya esta importada no una clase tuya)

@SantiClausen
Copy link
Author

en lo que no me ubico bien es como crear esa instancia, por que utilizo el método que se encuentra en el código de crear_producto, y no me funciona. Y segun el archivo que contiene el OrderProduct, esa clase solo tiene valores sacados de una base de datos

@RodrigoJacznik
Copy link
Contributor

Podes ver en las rutas del archivo routes.py, por ejemplo:

@rest.route("/product", methods=['GET', 'POST'])
def products():
    """
    Endpoint para obtener todos los productos o crear uno nuevo
    :return:
    """
    if request.method == 'POST':
        # Crea un nuevo producto recibiendo un JSON con atributos name y price
        # Ejemplo: {'name': 'Tenedor', 'price': 50}
        p = Product(name=request.get_json()['name'], price=request.get_json()['price'])

La siguiente linea:

p = Product(name=request.get_json()['name'], price=request.get_json()['price'])

Crea un producto con esos datos. Esa linea la podes reemplazar en un test por

p = Product(name="Silla", price=100)

Lo mismo podes hacer con OrderProduct para crear una instancia con cantidad negativa.

Aclaro que el test no tiene que fallar necesariamente. En caso que no falle, eso indica que la aplicación tiene un bug.

@SantiClausen
Copy link
Author

eso lo había visto, e intente agregarle 'quantity' para poder testear el ejercicio, pero me termino saltando un error diciendo que quantity es una palabra invalida para Product. ¿deberia edita routes.py para que pueda crear un codigo similar al product para orderproducts?

@TeoBotta
Copy link

Buenas, yo tengo el mismo enunciado y creo que lo resolví. Al igual que a Santiago, a mí me marea un poco también el tema de saber bien cómo creo la cantidad, pero lo entendí un poco mejor viendo el archivo 'models.py'.

Éste es el código que hice:

def test_crear_negativo(self):
    resp = self.client.get('/product')
    data = json.loads(resp.data)
    total_inicial = len(data)   # Contabilizo cantidad de productos antes de la prueba

    #Creo una nueva instancia para cargarla
    data = {
        'name': 'Cuchillo',
        'price': 60,
        'quantity': -1
    }
    
    resp = self.client.post('/orderProduct', data=json.dumps(data), content_type='application/json')

    # Verifica que la instancia con cantidad negativa no haya sido ingresada
    total_nuevo = len(data)
    self.assertNotEqual(total_inicial, total_nuevo)

Lo que hice fue cargar un producto con cantidad negativa y después verifiqué si me aumentaba la longitud de la tabla. De esta forma la aplicación pasa el test si no se cargó el producto.

@RodrigoJacznik
Copy link
Contributor

No, para hacer test no hay que editar ningun archivo.

Vos tenes que testear OrderProduct no Product

@SantiClausen
Copy link
Author

parece que logre solucionar el tema. Utilizando un comando en routes.py que se encuentra en order_product, hice el testeo y el pytest me salta lo que estaba buscando, es decir, me falla el test por agregarle un numero negativo, que es lo que necesitaba

@RodrigoJacznik
Copy link
Contributor

@TeoBotta el test esta mal porque el endpoint orderProduct no existe:

resp = self.client.post('/orderProduct', data=json.dumps(data), content_type='application/json')

El test es mucho mas simple, no pide que se testee desde la api, hay que testear directamente el modelo.

@SantiClausen como lo resolviste?

@TeoBotta
Copy link

@RodrigoJacznik Ah, perfecto. Ahí lo sigo revisando entonces. Gracias!

@SantiClausen
Copy link
Author

con esto:
image
lo que hice fue darle como dato un numero negativo, y despues escribi
image
cuando hize el test, me tiro una falla, y el lugar de la falla era donde yo puse el mensaje para el assert si el assert fallaba

@SantiClausen
Copy link
Author

image
esto me da le pytest, que entiendo que es lo que necesitaba conseguir

@RodrigoJacznik
Copy link
Contributor

RodrigoJacznik commented May 25, 2018

Cuando se testea la api hay que usar los endpoints disponibles en router, estos son:

@rest.route("/product", methods=['GET', 'POST'])
@rest.route("/order", methods=['GET'])
@rest.route("/order/<pk>", methods=['GET'])
@rest.route("/order/<pk>/product", methods=['POST'])
@rest.route("/order/<pk_order>/product/<pk_product>", methods=['GET', 'PUT', 'DELETE'])

No hay que modificar ningún archivo de la aplicación, excepto que estén arreglando algún bug encontrado por algún test lo cual es una tarea extra

@SantiClausen El endpoint /new_quantity no existe. No tenes que testear mediante el api, testea directamente el modelo.

@RodrigoJacznik
Copy link
Contributor

Te da un 404 porque la ruta /new_quantity no existe

@SantiClausen
Copy link
Author

SantiClausen commented May 25, 2018

¿a que se refiere con el modelo? ¿es el models.py?

@RodrigoJacznik
Copy link
Contributor

RodrigoJacznik commented May 25, 2018

A testear directamente la clase. Por ejemplo si quiero testear que un producto no permita que el precio sea negativo, lo que debería hacer es:

    def test_create_product_with_negative_price(self):
        def createProduct():
            return Product(name="Silla", price=-100)

        self.assertRaises(ValueError, createProduct)

Si quieren ir por la api:

    def test_create_product_with_negative_price_api(self):
        data = {
            'name': 'Tenedor',
            'price': -50
        }

        resp = self.client.post('/product', data=json.dumps(data), content_type='application/json')

        # Verifica que la respuesta tenga el estado 422 (Unprocessable Entity)
        assert resp.status == "422 Unprocessable Entity", "El POST no fallo"
        p = Product.query.all()

        # Verifica que en la lista de productos no haya productos
        self.assertEqual(len(p), 0, "El producto se creo con error")

@RodrigoJacznik
Copy link
Contributor

No se que es lo que tenes que testear. Acordate que la base de datos arranca vacía

@SantiClausen
Copy link
Author

aaah, entonces para hacer el testeo del get, ¿debo crear una base de datos y darle datos para hacer el testeo?

@RodrigoJacznik
Copy link
Contributor

Más o menos. La base de datos ya está creada, sólo tenes que cargar los datos

@nachomac12
Copy link

nachomac12 commented May 25, 2018

No se si estará bien, pero yo para "Hacer un test de unidad para probar el funcionamiento del método GET en el endpoint /product." hice

    def test_get_method(self):
        p=Product(name="Cuchara", price=60)
        db.session.add(p)
        db.session.commit
        p_disponibles = Product.query.all()
        self.assertIn(p,p_disponibles, "Trae el producto")

Capaz sirve. @

@RodrigoJacznik
Copy link
Contributor

En ese test te faltó probar el get en si, la primera parte está bien.

@SantiClausen
Copy link
Author

intente adaptar ese ejemplo a mi consigna:
image
pero ahora el error es distinto:
image

@nachomac12
Copy link

Sería algo así entonces?

    def test_get_method(self):
        p=Product(name="Cuchara", price=60)
        db.session.add(p)
        db.session.commit()
        resp = self.client.get('/product/1', content_type='aplication/json')
        assert(resp)

Traigo el producto 1 con el get. En este caso sería la Cuchara que es el único que habría en la db.

@RodrigoJacznik
Copy link
Contributor

@SantiClausen no estás creando bien la instancia. Mira como lo hago en reto archivo fixture.py

@nachomac12 casi está bien. Revisa que el assert no está controlando que el producto sea correcto, siempre va a existir la respuesta.

@nachomac12
Copy link

    def test_get_method(self):
        p=Product(name="Cuchara", price=60)
        db.session.add(p)
        db.session.commit()
        resp = self.client.get('/product/1', content_type='aplication/json')

@RodrigoJacznik puse un assert200(resp, 'Falla metodo get') y me tira AssertionError: 400!=200. Tengo que considerar que hay un bug?

@RodrigoJacznik
Copy link
Contributor

Debería probar el test y no estoy cerca de una compu, no creo que sea un bug.
Proba con /product/0

@nachomac12
Copy link

nachomac12 commented May 26, 2018

No no, no funciona tampoco. Ahora veo que es @rest.route("/product", methods=['GET', 'POST']), no tendría que pasarle una /product/<pk> creo

@RodrigoJacznik
Copy link
Contributor

Claro, no hay un endpoint para agarrar un sólo producto.

@nachomac12
Copy link

nachomac12 commented May 26, 2018

Solucionado (creo). Así me funcionó, por si a alguien le sirve

    def test_get_product_method(self):
        p=Product(name="Cuchara", price=60)
        db.session.add(p)
        db.session.commit()
        resp = self.client.get('/product')    
        data = json.loads(resp.data)
        self.assertEqual(len(data), 1, "No agarró nada")

@SantiClausen
Copy link
Author

ahi lei el fixture.py para compararlo con lo que debo hacer, y termine escribiendo mi codigo asi:
image
pero me termino largando un error grande en la prueba, y este parece ser el resumen:
image

@RodrigoJacznik
Copy link
Contributor

Esta mal el código, los for no son necesarios (el map también está de más) y no estás creando el producto.

El test tiene que ser:

  1. Crear producto
  2. Crear order
  3. Crear orderProduct
  4. Hacer el get y comprobar que devuelve lo correcto.

@SantiClausen
Copy link
Author

lo que me confunde es como crear una orden. Vi que hay una forma de crear un producto, pero para ordenes solo veo como obtener ordenes existentes

@SantiClausen
Copy link
Author

intente esto:
image
pero me da el error index out of range. Leyendo lo de como agregar un producto, si utilizo el codigo que nachomac12 proveyo, ¿acaso se genera un id para el producto aun si guardo solo nombre y precio?

@RodrigoJacznik
Copy link
Contributor

El producto lo tenes que crear por medio del modelo, no usando la api.
El código sigue estando mal, fijate los pasos. Los ids se autogeneran.

@SantiClausen
Copy link
Author

¿algo así?
image
sigo sin entender como crear una orden

@RodrigoJacznik
Copy link
Contributor

En la línea

p=Product(name="cuchillo", price=10)

Creas el producto, la orden se crea de la misma forma

o=Order()

La función createOrder no es necesaria

@SantiClausen
Copy link
Author

ahi parece que logro generarlas bien. El codigo me quedo asi:
image
pero a la vez, al hacer el pytest, me surge un nuevo problema:
image
intente reemplazar el 1 que se encuentra en /order/1/product/ con un 0, y parece que resuelve el problema, pero despues me lleva de nuevo al problema de index out of range en la sentencia del /order/1/product/1.
Intente remplazar esos 1s tambien con 0s, pero esta vez no resulta, y sigo con index out of range

@RodrigoJacznik
Copy link
Contributor

No hay que crear producto por medio de la api, el post no va.
Te faltó crear orderProducr.
La función db.session.commit() la tenes que llamar una sola vez, cuando ya no vas a hacer ningún db.session.add() más

@SantiClausen
Copy link
Author

asumiendo que orderProduct se crea igual que Product y Order, escribí esto:
image
pero ahora me da un error desconocido y grande:

______________ OrderingTestCase.test_get_order_pko_producto_pkp _______________

self = <sqlalchemy.engine.base.Connection object at 0x04227F30>
dialect = <sqlalchemy.dialects.sqlite.pysqlite.SQLiteDialect_pysqlite object at 0x042FE230>
constructor = <bound method DefaultExecutionContext._init_compiled of <class 'sqlalchemy.dialects.sqlite.base.SQLiteExecutionContext'>>
statement = 'INSERT INTO order_product (product_id, quantity) VALUES (?, ?)'
parameters = (1, 25)
args = (<sqlalchemy.dialects.sqlite.base.SQLiteCompiler object at 0x042A27B0>, [{'product_id': 1, 'quantity': 25}])
conn = <sqlalchemy.pool._ConnectionFairy object at 0x042FE7B0>
context = <sqlalchemy.dialects.sqlite.base.SQLiteExecutionContext object at 0x042A2470>

    def _execute_context(self, dialect, constructor,
                         statement, parameters,
                         *args):
        """Create an :class:`.ExecutionContext` and execute, returning
            a :class:`.ResultProxy`."""

        try:
            try:
                conn = self.__connection
            except AttributeError:
                # escape "except AttributeError" before revalidating
                # to prevent misleading stacktraces in Py3K
                conn = None
            if conn is None:
                conn = self._revalidate_connection()

            context = constructor(dialect, self, conn, *args)
        except BaseException as e:
            self._handle_dbapi_exception(
                e,
                util.text_type(statement), parameters,
                None, None)

        if context.compiled:
            context.pre_exec()

        cursor, statement, parameters = context.cursor, \
            context.statement, \
            context.parameters

        if not context.executemany:
            parameters = parameters[0]

        if self._has_events or self.engine._has_events:
            for fn in self.dispatch.before_cursor_execute:
                statement, parameters = \
                    fn(self, cursor, statement, parameters,
                       context, context.executemany)

        if self._echo:
            self.engine.logger.info(statement)
            self.engine.logger.info(
                "%r",
                sql_util._repr_params(parameters, batches=10)
            )

        evt_handled = False
        try:
            if context.executemany:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_executemany:
                        if fn(cursor, statement, parameters, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_executemany(
                        cursor,
                        statement,
                        parameters,
                        context)
            elif not parameters and context.no_parameters:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute_no_params:
                        if fn(cursor, statement, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute_no_params(
                        cursor,
                        statement,
                        context)
            else:
                if self.dialect._has_events:
                    for fn in self.dialect.dispatch.do_execute:
                        if fn(cursor, statement, parameters, context):
                            evt_handled = True
                            break
                if not evt_handled:
                    self.dialect.do_execute(
                        cursor,
                        statement,
                        parameters,
>                       context)

c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\engine\base.py:1193:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <sqlalchemy.dialects.sqlite.pysqlite.SQLiteDialect_pysqlite object at 0x042FE230>
cursor = <sqlite3.Cursor object at 0x04201F20>
statement = 'INSERT INTO order_product (product_id, quantity) VALUES (?, ?)'
parameters = (1, 25)
context = <sqlalchemy.dialects.sqlite.base.SQLiteExecutionContext object at 0x042A2470>

    def do_execute(self, cursor, statement, parameters, context=None):
>       cursor.execute(statement, parameters)
E       sqlite3.IntegrityError: NOT NULL constraint failed: order_product.order_id

c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\engine\default.py:507: IntegrityError

The above exception was the direct cause of the following exception:

self = <test.test_unit2.OrderingTestCase testMethod=test_get_order_pko_producto_pkp>

    def test_get_order_pko_producto_pkp(self):
        p=Product(name="cuchillo", price=60)
        db.session.add(p)
        o=Order()
        db.session.add(o)
        op=OrderProduct(product=p, quantity=25)
        db.session.add(op)
>       db.session.commit()

test_unit2.py:62:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\orm\scoping.py:153: in do
    return getattr(self.registry(), name)(*args, **kwargs)
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\orm\session.py:943: in commit
    self.transaction.commit()
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\orm\session.py:467: in commit
    self._prepare_impl()
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\orm\session.py:447: in _prepare_impl
    self.session.flush()
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\orm\session.py:2254: in flush
    self._flush(objects)
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\orm\session.py:2380: in _flush
    transaction.rollback(_capture_exception=True)
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\util\langhelpers.py:66: in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\util\compat.py:187: in reraise
    raise value
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\orm\session.py:2344: in _flush
    flush_context.execute()
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\orm\unitofwork.py:391: in execute
    rec.execute(self)
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\orm\unitofwork.py:556: in execute
    uow
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\orm\persistence.py:181: in save_obj
    mapper, table, insert)
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\orm\persistence.py:866: in _emit_insert_statements
    execute(statement, params)
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\engine\base.py:948: in execute
    return meth(self, multiparams, params)
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\sql\elements.py:269: in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\engine\base.py:1060: in _execute_clauseelement
    compiled_sql, distilled_params
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\engine\base.py:1200: in _execute_context
    context)
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\engine\base.py:1413: in _handle_dbapi_exception
    exc_info
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\util\compat.py:203: in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\util\compat.py:186: in reraise
    raise value.with_traceback(tb)
c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\engine\base.py:1193: in _execute_context
    context)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <sqlalchemy.dialects.sqlite.pysqlite.SQLiteDialect_pysqlite object at 0x042FE230>
cursor = <sqlite3.Cursor object at 0x04201F20>
statement = 'INSERT INTO order_product (product_id, quantity) VALUES (?, ?)'
parameters = (1, 25)
context = <sqlalchemy.dialects.sqlite.base.SQLiteExecutionContext object at 0x042A2470>

    def do_execute(self, cursor, statement, parameters, context=None):
>       cursor.execute(statement, parameters)
E       sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed: order_product.order_id [SQL: 'INSERT INTO order_product (product_id, quantity) VALUES (?, ?)'] [parameters: (1, 25)] (Background on this error at: http://sqlalche.me/e/gkpj)

c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\engine\default.py:507: IntegrityError
============================== warnings summary ===============================
test_unit2.py::OrderingTestCase::test_get_order_pko_producto_pkp
  c:\program files (x86)\python36-32\lib\site-packages\sqlalchemy\sql\crud.py:700: SAWarning: Column 'order_product.order_id' is marked as a member of the primary key for table 'order_product', but has no Python-side or server-side default generator indicated, nor does it indicate 'autoincrement=True' or 'nullable=True', and no explicit value is passed.  Primary key columns typically may not store NULL. Note that as of SQLAlchemy 1.1, 'autoincrement=True' must be indicated explicitly for composite (e.g. multicolumn) primary keys if AUTO_INCREMENT/SERIAL/IDENTITY behavior is expected for one of the columns in the primary key. CREATE TABLE statements are impacted by this change as well on most backends.
    util.warn(msg)

-- Docs: http://doc.pytest.org/en/latest/warnings.html
=============== 2 failed, 2 passed, 1 warnings in 6.39 seconds ================

@RodrigoJacznik
Copy link
Contributor

No se crea de esa forma revisa fixtue.py o el archivo routes.py

@SantiClausen
Copy link
Author

SantiClausen commented May 26, 2018

un momento, ya encontre el error:
image
me falto escribir los ids de order y product al orderproduct:
image
el error que aparece es del ejercicio anterior, pero ahora hay un tercer pass, siendo el test que estaba intentando hacer del segundo ejercicio

@RodrigoJacznik
Copy link
Contributor

Joya

@TeoBotta
Copy link

Buenas, modifiqué el código que subí ayer y creo que ahora estaría bien. No obstante, me tira un error en el assert, con lo cual creo que habría un bug para corregir, puede ser?

El código es así:

def test_cargar_negativo(self):
	# Creo la orden
	o = Order(id=1)
	db.session.add(o)

	# Creo el producto
	p = Product(id=1, name='Cuchillo', price=60)
	db.session.add(p)

	# Creo la relación entre producto y orden
	orderProduct = OrderProduct(order_id=1, product_id=1, quantity=-1, product= p)
	db.session.add(orderProduct)
	db.session.commit()

	# Comparo con el comando 'len' para ver si se agregó o no
	resp = self.client.post('order/1/product/1')
	op = OrderProduct.query.all()
	self.assertEqual(len(op),0,"Se creo el producto")

@SantiClausen
Copy link
Author

ahi parece funcionar, muchas gracias. Disculpe por las molestias

@RodrigoJacznik
Copy link
Contributor

Teo, esto está de más

resp = self.client.post('order/1/product/1')

@TeoBotta
Copy link

Ah claro, me quedó porque lo hice similar a otro test que hice y lo fui modificando a partir de ese. Ahí lo modifiqué y corre sin problemas, aunque el error del assert sigue estando.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

4 participants