2009-10-07 17 views
16

私はDjangoでのテストに移行しようとしています。 PART 1FileFieldでDjangoモデルをテストする

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

    # ... 

::これはテストのための問題の特定のモデルであり、どのように私はこれらの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) 

答えて

5

これは私の質問に対する部分的な答えであり、この質問を検索から見つけた他の人を助けるためです。

Djangoには、テスト中にデータの一次読み込みを処理するための'fixtures'と呼ばれる機能が含まれています。

  1. 管理ツール
  2. 実行]を使用してアプリケーションのモデルにいくつかの偽のデータを追加し、以下:manage.py dumpdataの[appnameの] --indent = 2> filename.jsonフィクスチャを作成すると、2段階のプロセスであります

フィクスチャファイル* .jsonはDjangoプロジェクトのルートフォルダに残ります。あなたのtests.pyファイルで

、あなたはとてもとしてジャンゴ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

こんにちは私はちょうど私がなってしまったいくつかのグーグルでの後、同じ問題を抱えていた:

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

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() 
関連する問題