代码之家  ›  专栏  ›  技术社区  ›  Hleb

如何用httpbasicauth注释测试烧瓶路由器方法

  •  0
  • Hleb  · 技术社区  · 8 年前

    我是python新手,我尝试在flask上实现rest api服务。我面临与代码测试相关的问题。我的烧瓶应用程序看起来像这样:

    from flask import Flask, jsonify, make_response, request
    from flask_httpauth import HTTPBasicAuth
    import os
    
    auth = HTTPBasicAuth()
    
    @auth.get_password
    def get_password(username):
        if username == os.environ['SERVICE_KEY']:
            return os.environ['SERVICE_PASS']
        return None
    
    @auth.error_handler
    def unauthorized():
        return make_response(jsonify({'error': 'Unauthorized access'}), 403)
    
    app = Flask(__name__)
    
    tweets = [
        {
            'id': 1,
            'profileId': '1',
            'message': 'My test tweet'
        },
        {
            'id': 2,
            'profileId': '1',
            'message': 'Second tweet!'
        }
    ]
    
    @app.route('/api/v1/tweets', methods=['GET'])
    @auth.login_required
    def get_tweets():
        return jsonify({'tweets': tweets}), 200
    
    @app.errorhandler(404)
    @auth.login_required
    def not_found(error):
        return make_response(jsonify({'error': 'Not found'}), 404)
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    这是我的测试(目前只针对 not_found 方法):

    import unittest
    from app import app
    
    class TestApp(unittest.TestCase):
    
        def setUp(self):
            self.app = app.test_client()
    
        def test_404(self):
            rv = self.app.get('/i-am-not-found')
            self.assertEqual(rv.status_code, 404)
    
    
    if __name__ == '__main__':
        unittest.main()
    

    但当我尝试运行测试时,由于收到“未经授权的访问”响应,测试失败:

    >python test.py
    F
    ======================================================================
    FAIL: test_404 (__main__.TestApp)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "test.py", line 25, in test_404
        self.assertEqual(rv.status_code, 404)
    AssertionError: 403 != 404
    
    ----------------------------------------------------------------------
    Ran 1 test in 0.000s
    
    FAILED (failures=1)
    

    哪种测试路由方法的方法更适合处理授权?我怎样才能修复那个失败的测试呢?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Tim Thompson    8 年前

    您需要创建一个包含身份验证详细信息的自定义头并将其与请求一起发送。像这样的:

    from base64 import b64encode    
    ...
    headers = {'Authorization': 'Basic ' + b64encode("{0}:{1}".format(username, password))}
    rv = self.app.get('/i-am-not-found', headers=headers)
    ...
    
    
    import unittest
    from app import app
    
    class TestApp(unittest.TestCase):
    
        def setUp(self):
            self.app = app.test_client()
    
        def test_404(self):
            headers = {
                'Authorization': 'Basic ' + b64encode("username:password")
            }
            rv = self.app.get('/i-am-not-found', headers=headers)
            self.assertEqual(rv.status_code, 404)
    
    
    if __name__ == '__main__':
        unittest.main()
    

    您的用户名和密码以表格形式发送 username:password 但是是base64编码的。如果对此进行扩展,有一些方法可以简化此过程,例如提取到一个函数中以始终传递头并外部化用于测试的用户名/密码。

    编辑:另外,我认为你应该在这里返回401代码。401通常在凭据不正确时使用,403通常在您已成功通过身份验证但无法访问资源时使用。一个非常简单的例子是登录facebook,但被限制访问另一个人标记为私有的照片。