2009-10-07 3 views
16

Я пытаюсь перейти к тестированию с помощью Django. Это конкретная модель, о которой идет речь:Тестирование моделей Django с FileField

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

    # ... 

ЧАСТЬ 1: Как я могу справиться с этими файловыми полями? (В частности, в том смысле, что мне нужно генерировать поддельные записи для проверки битов кода)

ЧАСТЬ 2: Ниже приведен код тестирования, который я начал писать. Правильно ли я делаю это или должен ли я использовать форму «насмешки»?

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) 

ответ

5

Это частичный ответ на мой вопрос и помощь тем, кто нашел этот вопрос в поиске.

Django включает в себя объект, который он называет 'fixtures' для обработки первичной загрузки данных во время тестирования. Создание арматуры представляет собой процесс 2 шага:

  1. Добавьте некоторые поддельные данные модели приложения с помощью инструмента администратора
  2. Выполните следующие действия: manage.py dumpdata [имя_приложения] --indent = 2> filename.json

Файл файла * .json остается в вашей корневой папке проекта Django.

В файле tests.py, вы можете загрузить прибор на класс Джанго TestCase, как так:

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

После того, что прибор загружен, вы можете использовать эти данные, как вы обычно используете ORM. Вот мой рабочий тестовый пример из приведенного выше кода, если вы хотите привести пример.

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

Это спасло меня много времени, спасибо! – micgeronimo

17

Привет я просто был такая же проблема, после того, как некоторая я прибегая к помощи в конечный итоге с:

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

Надеется, что это помогает кому-то.

+0

Я не мог сделать ваш пример tearDown. Для меня работала os.remove (self.tab.file.path) – bbrik

0

Вы должны инициализировать файлы после создания светильников:

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() 
Смежные вопросы