2012-06-19 2 views
3

페이지의 양식에서받은 사진을 업로드하는 기능에 대한 unittest를 작성하는 일에 열중하고 있습니다.피라미드 - 파일 업로드 양식을위한 unittest 작성

주요 문제는 더미 요청의 매개 변수를 게시하고 기능에 전달할 때 그림을 추가하는 방법을 이해할 수 없다는 것입니다.

다음은 테스트하려는 코드입니다.

감사

@view_config(route_name='profile_pic') 
def profilePictureUpload(request): 
if 'form.submitted' in request.params: 
    #max picture size is 700kb 
    form = Form(request, schema=PictureUpload) 

    if request.method == 'POST' and form.validate(): 
     upload_directory = 'filesystem_path' 
     upload = request.POST.get('profile') 
     saved_file = str(upload_directory) + str(upload.filename) 

     perm_file = open(saved_file, 'wb') 
     shutil.copyfileobj(upload.file, perm_file) 

     upload.file.close() 
     perm_file.close() 

    else: 
     log.info(form.errors) 
redirect_url = route_url('profile', request) 
return HTTPFound(location=redirect_url) 

답변

10

정말 나쁜 관행 (그리고 잠재적 인 보안 구멍) 실제로 클라이언트 (upload.filename)에서 제공하는 이름을 사용하여 파일 시스템에서 파일을 만들 수 있습니다.

코드에서 request.params, request.POST.get('profile'), upload.fileupload.filename을 호출합니다. 이 모든 것을 모방하여 궁극적으로 upload.file에 대한 StringIO 객체를 제공 할 수 있습니다.

class MockCGIFieldStorage(object): 
    pass 

upload = MockCGIFieldStorage() 
upload.file = StringIO('foo') 
upload.filename = 'foo.html' 

request = DummyRequest(post={'profile': upload, 'form.submitted': '1'}) 

response = profilePictureUpload(request) 
+0

내 코드에서 악의적 인 사례를 지적하고 답변 해 주셔서 감사합니다. 나는 그것을 고칠 것이다. –

관련 문제