繁体   English   中英

为Flask app unit test设置(模拟)请求标头

[英]Setting (mocking) request headers for Flask app unit test

有没有人知道在单元测试期间设置(模拟)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解决方案 此解决方案的前提是为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()

调用get()post()时,需要传入environ_base 例如,

client = app.test_client()
response = client.get('/your/url/', 
                      environ_base={'HTTP_USER_AGENT': 'Chrome, etc'})

然后你的request.user_agent应该是你传入的任何内容,你可以通过request.headers['User-Agent']访问它。

有关详细信息,请参阅http://werkzeug.pocoo.org/docs/test/#testing-api

即使@ chris-mckinnel编写的内容有效,我也不会选择在这种情况下使用environ_base

您可以轻松地执行以下操作:

with app.test_request_context('url', headers={'User-Agent': 'Your value'}):
    pass

这应该做的工作,同时它保持你的代码显式 - 显式优于隐式。

如果您想知道可以传递给test_request_context参考EnvironBuilder定义; 可以在这里找到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM