unitarias tests test running pruebas manage example create coverage django unit-testing

tests - Probando modelos Django con FileField



running tests django (3)

Estoy tratando de hacer la transición a las pruebas con Django. Este es el modelo particular en cuestión para la prueba:

class Media(models.Model): file = models.FileField(upload_to=''upload'',) thumbnail = models.ImageField(upload_to=''upload'', blank=True,) # ...

PARTE 1: ¿Cómo trato con estos FileFields? (Particularmente en el sentido de que necesito generar entradas falsas para probar bits de código)

PARTE 2: A continuación se muestra el código de prueba que he comenzado a escribir. ¿Estoy haciendo esto correctamente o debería estar usando una forma de "burla"?

from django.test import TestCase from django.test.client import Client from django.contrib.auth.models import User from mediamanager.models import Media class MediaManagerTestCase(TestCase): def setUp(self): self.fake_user = User.objects.create(username=''fakeuser'', is_staff=false) self.fake_staff = User.objects.create(username=''fakestaff'', is_staff=true) self.fake_admin = User.objects.create(username=''fakeadmin'', is_superuser=true) self.fake_media_image = Media.objects.create() # Hmmm... self.fake_media_video = Media.objects.create() # How do i do this... def testMediaCanEdit(self): perm = self.fake_media_image.can_edit(self.fake_user) self.assertEquals(perm, false)


Debes inicializar tus archivos después de la creación de los aparatos:

def setUp(self): files = UpFile.objects.all() for file in files: filepath = os.path.join(settings.MEDIA_ROOT, file.upfile.name) open(filepath, ''w'').close()


Esta es una respuesta parcial a mi pregunta y para ayudar a cualquier otra persona que haya encontrado esta pregunta en una búsqueda.

Django incluye una instalación a la que se refiere como ''fixtures'' para manejar la carga primaria de datos durante las pruebas. Crear un accesorio es un proceso de 2 pasos:

  1. Agrega algunos datos falsos al modelo de la aplicación usando la herramienta de administración
  2. Ejecute lo siguiente: manage.py dumpdata [appname] --indent = 2> filename.json

El archivo de accesorio * .json permanece en su carpeta raíz del proyecto Django.

En su archivo tests.py, puede cargar el dispositivo en la clase TestCase de Django de la siguiente manera:

class YourTestCase(TestCase): fixtures = [''filename.json'',''whatever.json'',]

Una vez que se haya cargado el dispositivo, puede usar los datos como lo haría normalmente con el ORM. Aquí está mi caso de prueba de trabajo del código anterior si desea un ejemplo.

from django.test import TestCase from django.contrib.auth.models import User from mediamanager.models import Media class MediaManagerTestCase(TestCase): fixtures = [''auth_data.json'',''mediamanager_data.json'',] def setUp(self): self.fakeuser = User.objects.get(username=''fakeuser'') self.fakestaff = User.objects.get(username=''fakestaff'') self.fakeadmin = User.objects.get(username=''fakeadmin'') def test_media_can_edit(self): um = Media.objects.get(pk=1) # Media owned by fakeuser sm = Media.objects.get(pk=2) # Media owned by fakstaff self.assertEquals(um.can_edit(self.fakeuser), True) self.assertEquals(sm.can_edit(self.fakeuser), False) self.assertEquals(um.can_edit(self.fakestaff), True) self.assertEquals(sm.can_edit(self.fakestaff), True) self.assertEquals(um.can_edit(self.fakeadmin), True) self.assertEquals(sm.can_edit(self.fakeadmin), True)


Hola, acabo de tener el mismo problema, después de algunas búsquedas en Google terminé con:

from django.test import TestCase from django.core.files import File as DjangoFile from home.models import Tab, File class FileModelTest(TestCase): def setUp(self): self.tab = Tab.objects.create( title="Title", html="<p>test</p>", published=True ) self.file = File.objects.create( tab=self.tab, file=DjangoFile(open("home/tests/models.py"), "test_file.css") ) def tearDown(self): self.file.delete() self.tab.delete()

Espero que esto ayude a alguien.