Тестирование моделей Django с FileField - PullRequest
16 голосов
/ 08 октября 2009

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

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

    # ...

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

ЧАСТЬ 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)

Ответы [ 3 ]

17 голосов
/ 03 декабря 2009

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

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

Надеюсь, это кому-нибудь поможет.

5 голосов
/ 08 октября 2009

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

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

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

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

В вашем файле tests.py вы можете загрузить прибор в класс TestCase Django следующим образом:

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 голосов
/ 07 июня 2011

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

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...