使用FileField测试Django模型

时间:2009-10-07 20:02:26

标签: django unit-testing

我正在尝试使用Django过渡到测试。这是用于测试的特定模型:

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

    # ...

第1部分:我如何处理这些FileFields? (特别是在我需要生成虚假条目以测试代码位的意义上)

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

3 个答案:

答案 0 :(得分:17)

嗨我刚遇到同样的问题,经过一些谷歌搜索后我最终得到了:

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

希望这有助于某人。

答案 1 :(得分:5)

这是对我的问题的部分答案,并帮助其他从搜索中找到此问题的人。

Django包含一个它称为'fixtures'的工具来处理测试期间的主要数据加载。创建夹具是一个两步过程:

  1. 使用管理工具
  2. 将一些虚假数据添加到应用的模型中
  3. 运行以下命令:manage.py dumpdata [appname] --indent = 2&gt; filename.json
  4. fixture文件* .json保留在Django项目根文件夹中。

    在tests.py文件中,您可以在Django TestCase类上加载fixture:

    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 :(得分: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()