2009-10-07 91 views
16

我正試圖過渡到使用Django進行測試。這是要測試的特定型號:使用FileField測試Django模型

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

    # ... 

第1部分:如何處理這些FileField? (特別是在我需要生成假條目以測試代碼位的意義上)

第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 [APPNAME] --indent = 2> filename.json

燈具文件* .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) 
+0

救了我大量的時間,謝謝! – micgeronimo 2015-01-08 14:42:31

17

嗨,我只是有同樣的問題,經過一番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() 

希望這可以幫助別人。

+0

我無法讓您的tearDown示例工作。什麼爲我工作是os.remove(self.tab.file.path) – bbrik 2015-11-27 18:52:16

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