-
Notifications
You must be signed in to change notification settings - Fork 20
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
Comments
Que test queres realizar? Con lo que ya esta en el archivo |
disculpe, ahi logre ubicarme mejor. Pero ahora tengo un problema distinto; quiero hacer un test de unidad, pero me salio un error: por curiosidad, hice un test al test_unit.py para ver si no yo borre algo, y me salio el mismo problema |
como estas corriendo los test? |
python [nombre del archivo], lo hago dentro del git bash. ¿Acaso se deben hacer en la consola de windows? |
No, como se mostró en clase, con el comando |
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 |
Pasame la salida del comando así te puedo dar una mano |
es muy largo, asi que le paso esto: lo que intente hacer era verificar si el orderproduct podía reconocer una entrada con cantidad negativa y denegarla por eso |
Los test escribilos en el archivo |
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 |
pero el ejercicio me pide verificar una clase especifica. ¿Debo llamar a esa clase dentro del método que escribo? |
Cual es el enunciado? |
"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." |
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) |
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 |
Podes ver en las rutas del archivo @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. |
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? |
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:
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. |
No, para hacer test no hay que editar ningun archivo. Vos tenes que testear OrderProduct no Product |
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 |
@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? |
@RodrigoJacznik Ah, perfecto. Ahí lo sigo revisando entonces. Gracias! |
Cuando se testea la api hay que usar los endpoints disponibles en router, estos son:
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. |
Te da un 404 porque la ruta |
¿a que se refiere con el modelo? ¿es el models.py? |
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") |
No se que es lo que tenes que testear. Acordate que la base de datos arranca vacía |
aaah, entonces para hacer el testeo del get, ¿debo crear una base de datos y darle datos para hacer el testeo? |
Más o menos. La base de datos ya está creada, sólo tenes que cargar los datos |
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
Capaz sirve. @ |
En ese test te faltó probar el get en si, la primera parte está bien. |
Sería algo así entonces?
Traigo el producto 1 con el get. En este caso sería la Cuchara que es el único que habría en la db. |
@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. |
@RodrigoJacznik puse un assert200(resp, 'Falla metodo get') y me tira AssertionError: 400!=200. Tengo que considerar que hay un bug? |
Debería probar el test y no estoy cerca de una compu, no creo que sea un bug. |
No no, no funciona tampoco. Ahora veo que es @rest.route("/product", methods=['GET', 'POST']), no tendría que pasarle una |
Claro, no hay un endpoint para agarrar un sólo producto. |
Solucionado (creo). Así me funcionó, por si a alguien le sirve
|
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:
|
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 |
El producto lo tenes que crear por medio del modelo, no usando la api. |
En la línea
Creas el producto, la orden se crea de la misma forma
La función createOrder no es necesaria |
No hay que crear producto por medio de la api, el post no va. |
No se crea de esa forma revisa fixtue.py o el archivo routes.py |
Joya |
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í:
|
ahi parece funcionar, muchas gracias. Disculpe por las molestias |
Teo, esto está de más
|
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. |
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?
The text was updated successfully, but these errors were encountered: