有没有人知道在单元测试期间设置(模拟)FLask(Werkzeug)提供的请求对象的User-Agent的方法?
目前看来,当我尝试获取诸如request.headers ['User-Agent']之类的细节时,会引发KeyError,因为Flask test_client()没有设置它们。 (参见下面的部分堆栈跟踪)
在单元测试期间尝试从Flask项目中的请求对象获取User-Agent时,会引发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 solution。此解决方案的前提是为Flask应用程序创建一个包装类,并覆盖调用方法以自动设置环境变量。这样,就为所有调用设置了变量。因此,我最终实现的解决方案是创建此代理类:
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()
答案 0 :(得分:24)
当您致电environ_base
或get()
时,您需要传递post()
。如,
client = app.test_client()
response = client.get('/your/url/',
environ_base={'HTTP_USER_AGENT': 'Chrome, etc'})
然后,您的request.user_agent
应该是您传入的内容,并且可以通过request.headers['User-Agent']
访问它。
答案 1 :(得分:2)
即使@ chris-mckinnel编写的内容有效,在这种情况下,我也不会选择使用environ_base
。
您可以轻松地执行以下操作:
with app.test_request_context('url', headers={'User-Agent': 'Your value'}):
pass
这应该可以完成工作,同时又可以使代码保持显式-显式比隐式更好。
如果您想知道可以传递给test_request_context
的内容,请参考EnvironBuilder
定义;可以在here中找到。