2012-04-24 2 views
5

파일을 저장하기 전에 오디오 파일인지 확인하는 자체 작성된 FormField AudioFileFormField를 테스트하려고합니다. 이를 위해 나는 to_python 메소드를 덮어 썼다. 이 FormField를 테스트하려고하면 몇 가지 어려움이있었습니다. 이것은 지금까지 내 TestCase에있다양식 테스트를 위해 filedata를 시뮬레이션하는 올바른 방법은 무엇입니까?

: '파일'개체가 어떤 속성 내가 디버그 추적 오른쪽을 삽입 할 때

을 '얻을'을주지 않습니다

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 

? AttributeUrror를 피하기 위해 SimpleUploadedFile에 파일을 전달하는 올바른 방법은 무엇입니까?

답변

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

당신의'upload /'디렉토리를 오염시키지 못하셨습니까? –

5
(이 질문은 "장고 테스트 업로드를 시뮬레이션 '의 최고 구글 결과이기 때문에)

대체 솔루션 : 장고의 내장 테스트 클라이언트는 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)