2009-10-07 32 views
16

Tôi đang cố gắng chuyển sang thử nghiệm với Django. Đây là mô hình cụ thể được đề cập để thử nghiệm:Thử nghiệm Mô hình Django với FileField

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

    # ... 

PHẦN 1: Làm cách nào để giải quyết các FileField này? (Đặc biệt trong ý nghĩa rằng tôi cần tạo các mục giả để kiểm tra các bit mã)

PHẦN 2: Dưới đây là mã thử nghiệm mà tôi đã bắt đầu viết. Tôi đang làm điều này một cách chính xác hay tôi nên sử dụng một hình thức "chế nhạo"?

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) 

Trả lời

5

Đây là câu trả lời một phần cho câu hỏi của tôi và giúp bất kỳ ai khác tìm thấy câu hỏi này từ tìm kiếm.

Django bao gồm một cơ sở mà nó đề cập đến là 'fixtures' để xử lý tải dữ liệu chính trong khi thử nghiệm. Tạo một vật cố là một quá trình 2 bước:

  1. Thêm một số dữ liệu giả để mô hình của ứng dụng bằng cách sử dụng công cụ quản trị
  2. Run như sau: manage.py dumpdata [appname] --indent = 2> filename.json

Tệp cố định * .json vẫn còn trong thư mục gốc của dự án Django.

Trong file tests.py của bạn, bạn có thể tải các trận đấu trên lớp Django TestCase như vậy:

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

Khi trận đấu được nạp, bạn có thể sử dụng dữ liệu như bình thường sẽ sử dụng ORM. Đây là trường hợp thử nghiệm làm việc của tôi từ mã trên nếu bạn muốn một ví dụ.

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

Đó lưu lại cho tôi rất nhiều thời gian, cảm ơn bạn! – micgeronimo

17

Hi tôi chỉ có cùng một vấn đề, sau khi một số googling tôi đã kết thúc với:

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 một ai đó.

+0

Tôi không thể tạo ví dụ tearDown của bạn. Điều gì đã làm việc cho tôi là os.remove (self.tab.file.path) – bbrik

0

Bạn nên khởi tạo tập tin của bạn sau khi tạo đồ đạc:

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() 
Các vấn đề liên quan