python - 为 Flask 应用程序单元测试设置(模拟)请求 header

标签 python unit-testing flask

有谁知道在单元测试期间设置(模拟)FLask (Werkzeug) 提供的请求对象的 User-Agent 的方法吗?

就目前而言,当我尝试获取诸如 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 solution .该方案的前提是为 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()

最佳答案

调用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了解更多信息。

关于python - 为 Flask 应用程序单元测试设置(模拟)请求 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15278285/

相关文章:

python - Tkinter Text 关闭但 ipython 控制台继续无限期运行

java - guava-teSTLib future 版本 JAR

c# - 我可以在Visual Studio中为单元测试/负载测试创建自定义TestContext计时器吗?

c# - 我应该如何在 Controller 中模拟 SignalR HubContext 以进行单元测试?

mysql - Flask-SQLAlchemy + MySQL + JSON 列。更新不工作

python - Flask WTForms Integerfield 类型是文本而不是数字

python - 使用 Waitress、Flask 和 Python 将请求记录到文件

python - 在 python 中检查变量是否为数字类型的最佳方法是什么

python - 带有 HelloSign API 的单选按钮

python - 使 flake8 区分未定义函数和星形导入