web-dev-qa-db-fra.com

Comment puis-je simuler les paramètres request.POST et GET pour les tests unitaires dans Flask?

Je voudrais simuler des paramètres de requête pour les tests unitaires. Comment puis-je atteindre cet objectif dans Flask?

33
nubela

Avez-vous lu Flask docs sur testing ?

Vous pouvez utiliser ce qui suit:

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', ...))

La version de développement actuelle de Flask inclut également la prise en charge de test des API JSON :

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'])
47
plaes

POSTER:

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

OBTENIR:

self.app.get('/endpoint', query_string=params)
29
Itay Kahana

Si vous préférez utiliser test_request_context:

 importer unittest 
 depuis myapp importer extract_query_params 

 testapp = flask.Flask (__ name __) 

 class TestFoo (unittest.TestCase): 
 def test_happy (auto): 
 avec testapp.test_request_context ('? limit = 1 & offset = 2'): 
 limite, offset = extract_query_params (['limite', 'offset']) 
 self.assertEquals (limite, 1) 
 self.assertEquals (offset, 2) 
2
Matthew Moisen

J'avais toujours un problème avec ceci lors du test des données post-formulaire pour la connexion, cela a fonctionné pour moi.

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')

J'ai trouvé que c'est comme ça.

Chrome: Mode développeur -> Doc -> Le document HTML demandé -> Onglet En-têtes -> Données de formulaire -> Afficher la source

0
sonance207

voici un exemple de code complet d'un test unitaire

testapp = app.test_client()

class Test_test(unittest.TestCase):
    def test_user_registration_bad_password_short(self):
        response = self.register(name='pat',
                                 email='[email protected]', 
                                 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
Barka