2009-10-07 18 views
16

Próbuję przejść do testowania z Django. Jest to konkretny model w pytaniu do testowania:Testowanie modeli Django za pomocą FileField

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

    # ... 

CZĘŚĆ 1: Jak radzić sobie z tymi FileFields? (Szczególnie w tym sensie, że muszę generować fałszywe wpisy do testowania bitów kodu)

CZĘŚĆ 2: Poniżej znajduje się kod testowy, który zacząłem pisać. Czy robię to poprawnie, czy powinienem używać formy "kpiny"?

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) 

Odpowiedz

5

To jest częściowa odpowiedź na moje pytanie i pomoc wszystkim, którzy znaleźli to pytanie podczas wyszukiwania.

Django zawiera obiekt oznaczony jako 'fixtures' do obsługi podstawowego ładowania danych podczas testowania. Tworzenie urządzenie jest procesem 2 krok:

  1. Dodaj kilka fałszywych danych do modelowania aplikacji przy użyciu narzędzia administracyjnego
  2. uruchom następujące: manage.py dumpdata [appname] --indent = 2> filename.json

Plik oprawy * .json pozostaje w folderze głównym projektu Django.

W pliku tests.py można ładować urządzenie w klasie TestCase Django jak tak:

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

Gdy urządzenie jest ładowane, można wykorzystać dane, jak można normalnie używać ORM. Oto mój przykład pracy z powyższego kodu, jeśli chcesz podać przykład.

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

To uratowało mi dużo czasu, dziękuję! – micgeronimo

17

Cześć Po prostu miałem ten sam problem, po niektóre googling I zakończył się z:

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

Hope this helps kogoś.

+0

Nie mogłem sprawić, aby Twój przykład tearDown działał. To co dla mnie działa to os.remove (self.tab.file.path) – bbrik

0

Należy zainicjować plików po utworzeniu lamp:

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() 
Powiązane problemy