【问题标题】:(Flask) Faking request.environ['REMOTE_USER'] for testing(Flask) 伪造 request.environ['REMOTE_USER'] 进行测试
【发布时间】:2015-12-22 14:53:30
【问题描述】:

我正在 IIS 上部署一个 Flask 应用程序并使用其 Windows 身份验证,如果身份验证成功,它将 request.environ['REMOTE_USER'] 设置为您的 Windows 用户名。现在在编写测试用例时,我如何伪造 request.environ['REMOTE_USER']?测试用例独立于 IIS 服务器运行。

我的尝试:

from flask import request

def test_insert_cash_flow_through_post(self):
    """Test that you can insert a cash flow through post."""
    request.environ['REMOTE_USER'] = 'foo'
    self.client.post("/index?account=main",
                     data=dict(settlement_date='01/01/2016',
                               transaction_type='Other',
                               certainty='Certain',
                               transaction_amount=1))
    assert CashFlow.query.first().user == 'foo'

我的视图中处理“REMOTE_USER”的部分类似于:

cf = CashFlow(...,
              user=request.environ.get('REMOTE_USER'),
              ...)
db.session.add(cf)

【问题讨论】:

  • 我到处查看授权用户登录名的存储位置。我在 Flask 文档中没有看到它。很高兴在这里看到它。

标签: python iis flask wsgi


【解决方案1】:

Setting (mocking) request headers for Flask app unit test 找到我自己问题的答案。有一个environ_base 参数,您可以将请求环境变量传递到其中。它记录在werkzeug.test.EnvironBuilder

    def test_insert_cash_flow_through_post(self):
    """Test that you can insert a cash flow through post."""
    assert not CashFlow.query.first()
    self.client.post("/index?account=main",
                     environ_base={'REMOTE_USER': 'foo'},
                     data=dict(settlement_date='01/01/2016',
                               transaction_type='Other',
                               certainty='Certain',
                               transaction_amount=1))
    assert CashFlow.query.first().user == 'foo'

【讨论】:

    【解决方案2】:

    您不必伪造它。您可以在测试中设置它。

    from flask import request
    
    def test_something():
        request.environ['REMOTE_USER'] = 'some user'
        do_something_with_remote_user()
        del request.environ['REMOTE_USER']
    

    如果您担心保留可能已经设置的任何值,您也可以轻松做到这一点。

    def test_something():
        original_remote_user = request.environ.get('REMOTE_USER')
        do_something_with_remote_user()
        request.environ['REMOTE_USER'] = original_remote_user
    

    您也可以在更高的范围内处理此问题,但在不知道测试的结构的情况下,很难告诉您如何做到这一点。

    【讨论】:

    • 感谢您的回复,但 request.environ 与 os.environ 不同。 WSGI 提供 request.environ 中的所有数据。我想我需要想办法修改 request.environ。
    • 对不起,那是脑子放屁。不过,它应该以同样的方式工作。
    • 没关系,让它与 'environ_base' 参数一起工作。感谢您的尝试。
    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2014-01-01
    • 2021-09-20
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多