2012-06-19 24 views
3

我正在努力创建单元测试,负责上传从页面上的表单接收的图片。金字塔 - 写文件上传单元测试

主要问题是,我无法弄清楚如何添加图片来发布虚拟请求的参数,并将其传递给函数。

这里是我正在测试的代码。

感谢

@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.paramsrequest.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

谢谢你的回答,并指出我的代码中的不良做法。 我一定会修复它。 –