Подтвердить что ты не робот

Тестирование моделей Django с помощью FileField

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

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)
4b9b3361

Ответ 1

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

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

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

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

В файле tests.py вы можете загрузить прибор в классе Django 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)

Ответ 2

Привет, у меня была одна и та же проблема, после того, как в какой-то googling я закончил:

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

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

Ответ 3

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

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