有谁知道在单元测试期间设置(模拟)FLask(Werkzeug)提供的请求对象的用户代理的方法?
就目前而言,当我尝试获取诸如 request.headers['User-Agent'] 之类的详细信息时,会引发 KeyError,因为 Flask test_client() 没有设置这些信息。(请参阅下面的部分堆栈跟踪)
在单元测试期间尝试从 Flask 项目中的请求对象获取用户代理时,会引发 KeyError。
File "/Users/me/app/rest/app.py", line 515, in login
if request.headers['User-Agent']:
File "/Users/me/.virtualenvs/app/lib/python2.7/site-packages/werkzeug/datastructures.py", line 1229, in __getitem__
return self.environ['HTTP_' + key]
KeyError: 'HTTP_USER_AGENT'
- 更新 -
连同下面的(接受的)解决方案,environ_base 提示将我引向这个其他SO 解决方案。该方案的前提是为 Flask 应用创建一个包装类,并重写call方法以自动设置环境变量。这样,为所有调用设置变量。所以,我最终实现的解决方案是创建这个代理类:
class FlaskTestClientProxy(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
environ['REMOTE_ADDR'] = environ.get('REMOTE_ADDR', '127.0.0.1')
environ['HTTP_USER_AGENT'] = environ.get('HTTP_USER_AGENT', 'Chrome')
return self.app(environ, start_response)
然后用该代理包装 WSGI 容器:
app.wsgi_app = FlaskTestClientProxy(app.wsgi_app)
test_client = app.test_client()