aquí está mi punto de vista (simplificado):
@login_required(login_url='/try_again') def change_bar(request): foo_id = request.POST['fid'] bar_id = request.POST['bid'] foo = models.Foo.objects.get(id=foo_id) if foo.value > 42: bar = models.Bar.objects.get(id=bar_id) bar.value = foo.value bar.save() return other_view(request)
Ahora me gustaría comprobar si esta vista funciona correctamente (en este modelo simplificado, si la instancia de Bar cambia de valor cuando debería). ¿Cómo lo hago?
Voy a suponer que te refieres a pruebas automatizadas en lugar de solo verificar que la solicitud posterior parece funcionar. Si se refiere a lo último, simplemente verifique ejecutando la solicitud y verificando los valores de Foo
y Bar
relevantes en un shell o en el administrador.
La mejor manera de enviar solicitudes POST
es usando un Client
. Asumiendo que el nombre de la vista es my_view
:
from django.test import Client from django.urls import reverse c = Client() c.post(reverse('my_view'), data={'fid':43, 'bid':20})
Pero aún necesita algunos datos iniciales en la base de datos, y debe verificar si se realizaron los cambios que esperaba. Aquí es donde podrías usar un TestCase
:
from django.test import TestCase, Client from django.urls import reverse FooBarTestCase(TestCase): def setUp(self): # create some foo and bar data, using foo.objects.create etc # this will be run in between each test - the database is rolled back in between tests def test_bar_not_changed(self): # write a post request which you expect not to change the value # of a bar instance, then check that the values didn't change self.assertEqual(bar.value, old_bar.value) def test_bar_changes(self): # write a post request which you expect to change the value of # a bar instance, then assert that it changed as expected self.assertEqual(foo.value, bar.value)
Una biblioteca que encuentro útil para configurar algunos datos para ejecutar las pruebas más fácilmente es FactoryBoy . Reduce el estándar cuando se trata de crear nuevas instancias de Foo
o Bar
con fines de prueba. Otra opción es escribir accesorios, pero me parece menos flexible si tus modelos cambian.
También recomendaría este libro si desea obtener más información sobre las pruebas en python. Está orientado a django, pero los principios se aplican a otros marcos y contextos.
editar: se agregaron consejos sobre factoryboy y enlace al libro
puede intentar poner declaraciones de "impresión" entre el código y ver si se guarda el valor correcto. También para actualizar en lugar de consultar con "get" y luego guardarlo (bar.save()), puede usar el método "filter" y "update".
@login_required(login_url='/try_again') def change_bar(request): foo_id = request.POST['fid'] bar_id = request.POST['bid'] foo = models.Foo.objects.get(id=foo_id) if foo.value > 42: models.Bar.objects.filter(id=bar_id).update(value=foo.value) #bar.value = foo.value #bar.save() return other_view(request)