How can I fake request.POST and GET params for unit testing in Flask?

后端 未结 5 1133
广开言路
广开言路 2020-12-30 18:33

I would like to fake request parameters for unit testing. How can I achieve this in Flask?

相关标签:
5条回答
  • 2020-12-30 19:09

    Did you read Flask docs about testing?

    You can use following:

    self.app.post('/path-to-request', data=dict(var1='data1', var2='data2', ...))
    self.app.get('/path-to-request', query_string=dict(arg1='data1', arg2='data2', ...))
    

    Current development version of Flask also includes support for testing JSON APIs:

    from flask import request, jsonify
    
    @app.route('/jsonapi')
    def auth():
        json_data = request.get_json()
        attribute = json_data['attr']
        return jsonify(resp=generate_response(attribute))
    
    with app.test_client() as c:
        rv = c.post('/jsonapi', json={
            'attr': 'value', 'other': 'data'
        })
        json_data = rv.get_json()
        assert generate_response(email, json_data['resp'])
    
    0 讨论(0)
  • 2020-12-30 19:12

    here is a complete code example of a unit test

    testapp = app.test_client()
    
    class Test_test(unittest.TestCase):
        def test_user_registration_bad_password_short(self):
            response = self.register(name='pat',
                                     email='me@mail.com', 
                                     password='Flask', 
                                     password2='Flask')
            self.assertEqual(response.status_code, 200)
            self.assertIn(b'password should be 8 or more characters long', 
                          response.data)
    
        def register(self, name, email, password, password2):
            return testapp.post(
                '/register',
                data=dict(username=name, 
                          email=email, 
                          password=password, 
                          password2=password2),
                follow_redirects=True
            )
    
    0 讨论(0)
  • 2020-12-30 19:19

    POST:

    self.app.post('/endpoint', data=params)
    

    GET:

    self.app.get('/endpoint', query_string=params)
    
    0 讨论(0)
  • 2020-12-30 19:22

    If you prefer to use test_request_context:

    import unittest
    from myapp import extract_query_params
    
    testapp = flask.Flask(__name__)
    
    class TestFoo(unittest.TestCase):
        def test_happy(self):
            with testapp.test_request_context('?limit=1&offset=2'):
                limit, offset = extract_query_params(['limit', 'offset'])
                self.assertEquals(limit, 1)
                self.assertEquals(offset, 2)
    
    0 讨论(0)
  • 2020-12-30 19:26

    I still had issue with this when testing post form data for logging in this worked for me.

    def login(self, username, password):
        return self.app.post('/', data='Client_id=' + username +'&Password=' + password,
                             follow_redirects=True,content_type='application/x-www-form-urlencoded')
    

    I found this is out this way.

    Chrome: Developer mode --> Doc --> HTML doc that was requested --> Headers Tab --> Form data --> view source

    0 讨论(0)
提交回复
热议问题