2009-10-07 6 views
16

के साथ Django मॉडल परीक्षण करना मैं 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) 

उत्तर

5

यह मेरे प्रश्न का आंशिक उत्तर है, और किसी अन्य व्यक्ति को खोजने के लिए जो इस प्रश्न को खोज से मिला है।

डीजेंगो में एक सुविधा शामिल है जो इसे 'fixtures' के रूप में संदर्भित करती है ताकि परीक्षण के दौरान डेटा की प्राथमिक लोडिंग को संभाला जा सके।

  1. एप्लिकेशन के मॉडल के लिए कुछ नकली डेटा व्यवस्थापक उपकरण
  2. रन का उपयोग करें निम्नलिखित: manage.py DumpData [APPNAME] --indent = 2> filename.json एक दृढ़ बनाना एक 2 चरणों वाली प्रक्रिया है

स्थिरता फ़ाइल * .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

17

हाय मैं बस, एक ही समस्या थी के बाद कुछ 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() 

आशा इस कोई मदद करता है।

+0

मैं तुम्हारा आंसू नहीं कर सकता उदाहरण उदाहरण। मेरे लिए क्या काम था 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()