2009-10-07 23 views
16

estoy tratando de hacer la transición a las pruebas con Django. Este es el modelo en cuestión para la prueba:Prueba Django modelos con FileField

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

    # ... 

PARTE 1: ¿Cómo puedo lidiar con estas FileFields? (En particular, en el sentido de que necesito para generar entradas falsas para probar fragmentos de código)

Parte 2: A continuación se muestra el código de prueba que he empezado 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) 

Respuesta

5

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 que se refiere como 'fixtures' para manejar la carga primaria de datos durante la prueba. Creación de un accesorio es un proceso de 2 pasos:

  1. Añadir algunos datos falsos para el modelo de la aplicación utilizando la herramienta de administración
  2. Ejecutar el siguiente: manage.py dumpdata [nombreaplic] --indent = 2> filename.json

El archivo fixture * .json permanece en la carpeta raíz del proyecto Django.

En el archivo tests.py, puede cargar el aparato en la clase TestCase Django como tan:

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

Una vez que se carga el dispositivo, puede utilizar los datos como se suele utilizar 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) 
+0

que me salvó un montón de tiempo, gracias! – micgeronimo

17

Hola acabo de tener el mismo problema, después de algunas 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.

+0

No pude hacer funcionar su ejemplo de lágrima. Lo que funcionó para mí fue os.remove (self.tab.file.path) – bbrik

0

Usted debe inicializar sus archivos después de la creación accesorios:

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() 
Cuestiones relacionadas