使用FileField测试Django模型

T. *_*one 17 django unit-testing

我正试图通过Django过渡到测试.这是用于测试的特定模型:

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

    # ...
Run Code Online (Sandbox Code Playgroud)

第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)
Run Code Online (Sandbox Code Playgroud)

小智 18

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

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()
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人.


T. *_*one 5

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

Django包含一个工具,它称为"固定装置",用于处理测试期间的主要数据加载.创建夹具是一个两步过程:

  1. 使用管理工具将一些虚假数据添加到应用程序的模型中
  2. 运行以下命令:manage.py dumpdata [appname] --indent = 2> filename.json

fixture文件*.json保留在Django项目根文件夹中.

在tests.py文件中,您可以在Django TestCase类中加载fixture,如下所示:

class YourTestCase(TestCase):    
    fixtures = ['filename.json','whatever.json',]
Run Code Online (Sandbox Code Playgroud)

加载夹具后,您可以像通常使用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)
Run Code Online (Sandbox Code Playgroud)