有没有人知道在单元测试期间设置(模拟)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'
Run Code Online (Sandbox Code Playgroud)
- 更新 -
除了以下(接受)解决方案之外,environ_base提示引导我使用其他SO解决方案.此解决方案的前提是为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)
Run Code Online (Sandbox Code Playgroud)
然后用该代理包装WSGI容器:
app.wsgi_app = FlaskTestClientProxy(app.wsgi_app)
test_client = app.test_client()
Run Code Online (Sandbox Code Playgroud) 如何remote_addr
在烧瓶 test_request_context 中设置属性?这个问题:通过nosetests测试flask应用程序时获取IP地址(以及其他类似的问题)解释了如何使用get/post/whatever测试客户端调用来做到这一点,但我没有使用这些(在本例中)。相反,我得到一个 test_request_context,然后调用一个函数,从而允许我单独测试视图函数调用的函数。
编辑:澄清一下,我的测试代码如下所示:
with app.test_request_context():
result=my_function_which_expects_to_be_called_from_a_request_context()
<check result however>
Run Code Online (Sandbox Code Playgroud)
因此,我绝不会使用测试客户端调用。