5

ファイルを保存する前にファイルがオーディオファイルであるかどうかをチェックする、自己記述の FormField AudioFileFormField をテストしようとしています。そのために、to_python メソッドを上書きしました。この FormField をテストしようとすると、いくつかの問題が発生しました。

これはこれまでの私のテストケースです:

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: 'file' object has no attribute 'get' を発生させます

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 に渡す正しい方法は何でしょうか?

4

2 に答える 2

7

わかりました、新鮮な外観には多くの価値があります。これは私の新しい 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() )
于 2012-04-24T13:43:13.353 に答える
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)
于 2012-10-31T10:42:48.037 に答える