2012-04-24 3 views
5

私は自分で書き込んだFormField AudioFileFormFieldをテストしようとしています。FormField AudioFileFormFieldは、ファイルが保存される前にオーディオファイルかどうかをチェックします。そのために、私はto_pythonメソッドを上書きしました。このFormFieldをテストしようとするといくつかの問題が発生しました。フォームをテストするためにfiledataをシミュレートする正しい方法は何ですか?

これは、これまでのところ、私のTestCaseです:

from django import forms 
from django.core.files.uploadedfile import SimpleUploadedFile 
from django.test import TestCase 

class TestAudioFileFormField(TestCase): 
    """ test the formfield to use for AudioFile Uploads """ 

    class TestForm(forms.Form): 
     audiofilefield = AudioFileFormField() 


    def setUp(self): 

     self.AUDIOFILE_TEST_ROOT = os.path.dirname(__file__) + '/data/' 
     self.files = audiofile_files 


    def test_to_python(self): 
     """ assign some files to a form and validate the form """ 

     f = file(self.AUDIOFILE_TEST_ROOT + self.files[0]) 
     file_data = {'audiofilefield':SimpleUploadedFile(self.files[0],f.read())} 
     data = {} 

     form = self.TestForm(data,f) 
     form.is_valid() 

ラインform.is_validは、()はAttributeErrorを発生させます:「ファイル」オブジェクトには、属性を持っていない私はデバッグトレースを右に挿入すると

「を取得します」 )(form.is_valid前に、これは私がその対話セッションで得るものです:

ipdb> form.is_valid() 
AttributeError: 'file' object has no attribute 'get' 
ipdb> suf = file_data['audiofilefield'] 
ipdb> suf 
<SimpleUploadedFile: invalid_format.mp3 (text/plain)> 
ipdb> dir(suf) 
[lots of info here] 
ipdb> form.is_valid() 
True 

フォーム検証が動作しているように、正確に、私は、対話型のセッションに変わりましたか? AttributeErrorを避けるためにファイルをSimpleUploadedFileに渡す正しい方法は何でしょうか?

答えて

7

[OK]を、新鮮な外観は多くの価値がある可能性があります。これが私の新しいtest_to_pythonテストで、今回はそれが動作します:

def test_to_python(self): 
    f = file(self.AUDIOFILE_TEST_ROOT + self.files[0]) 
    file_data = {'audiofilefield':SimpleUploadedFile(self.files[0],f.read())} 
    data = {} 
    form = self.TestForm(data,file_data) 
    self.assertTrue(form.is_valid()) 
+2

これはあなたの 'upload /'ディレクトリを汚染していませんか? –

5
(この質問は「Djangoのテストは、アップロードをシミュレート」のトップ、Googleの結果であるため)

代替ソリューション:Djangoの組み込みテスト・クライアントは、POSTデータとしてオープンしたファイルオブジェクトを受け入れます:

# the form 
class TestForm(forms.Form): 
    audiofilefield = AudioFileFormField() 

# the view 
def upload_view(request): 
    form = TestForm(data=request.POST or None, files=request.FILES or None) 
    if request.method == 'POST': 
     if form.is_valid(): 
       return HttpResponse('success') 
     else: 
       return HttpResponse('fail') 

# the test function 
class UploadTest(TestCase): 
    def test_upload(self): 
     c = Client() # django.test.client.Client 
     formdata = {} 
     with open('/my/audiofile.mp3', 'rb') as f: 
      formdata['audiofilefield'] = f 
      response = c.post('/my-test-view/', formdata) 
関連する問題