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:
- Agrega algunos datos falsos al modelo de la aplicación usando la herramienta de administración
- 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.