Tester la connexion et l'authentification de Flask?
Je suis l'élaboration d'un Flacon d'application et l'utilisation de Flacon de sécurité pour l'authentification de l'utilisateur (qui à son tour utilise en Flacon de connexion ci-dessous).
J'ai un parcours qui nécessite une authentification, /user
. Je suis en train d'écrire un test unitaire qui teste que, pour un utilisateur authentifié, il renvoie la réponse appropriée.
Dans mon unittest je suis en création d'un utilisateur et l'enregistrement de manière que l'utilisateur comme suit:
from unittest import TestCase
from app import app, db
from models import User
from flask_security.utils import login_user
class UserTest(TestCase):
def setUp(self):
self.app = app
self.client = self.app.test_client()
self._ctx = self.app.test_request_context()
self._ctx.push()
db.create_all()
def tearDown(self):
if self._ctx is not None:
self._ctx.pop()
db.session.remove()
db.drop_all()
def test_user_authentication():
# (the test case is within a test request context)
user = User(active=True)
db.session.add(user)
db.session.commit()
login_user(user)
# current_user here is the user
print(current_user)
# current_user within this request is an anonymous user
r = test_client.get('/user')
Dans le test current_user
renvoie l'utilisateur approprié. Toutefois, l'affichage retourne toujours une AnonymousUser
comme le current_user
.
La /user
itinéraire est défini comme:
class CurrentUser(Resource):
def get(self):
return current_user # returns an AnonymousUser
Je suis assez certain que je ne suis pas la pleine compréhension de la façon dont les essais Flacon demande contextes de travail. J'ai lu ce Flacon Contexte de demande de documentation un tas, mais je suis toujours pas à comprendre comment aborder cette unité particulière de test.
source d'informationauteur frnsys
Vous devez vous connecter pour publier un commentaire.
Le problème est que le
test_client.get()
appel provoque un nouveau contexte de demande à être poussé, donc l'un de vous a poussé dans votre lasetUp()
méthode de votre cas de test n'est pas celui que l'/user
gestionnaire voit.Je pense que l'approche présentée dans le Connexion et À la déconnexion et Test De L'Ajout De Messages sections de la documentation est la meilleure approche pour tester les connexions. L'idée est d'envoyer la demande de connexion par le biais de l'application, comme un simple client. Cela va prendre soin de l'enregistrement de l'utilisateur connecté dans la session de l'utilisateur du client de test.
Le problème sont différentes de demande de contextes.
Dans le cours normal de votre Flacon de demande, chaque demande de crée un nouveau contexte qui seront réutilisés à travers l'ensemble de la chaîne jusqu'à la création de la finale de la réponse et de l'envoyer au navigateur.
Lorsque vous créez et exécutez Flacon de tests et l'exécution d'une demande (par exemple,
self.client.post(...)
) le contexte est abandonnée après la réception de la réponse. Par conséquent, lacurrent_user
est toujours unAnonymousUser
.Pour résoudre ce problème, nous devons le dire Flacon de réutiliser le même contexte pour l'ensemble du test. Vous pouvez le faire simplement en emballage de votre code avec:
Vous pouvez en lire plus à ce sujet dans la suite de merveilleux article:
https://realpython.com/blog/python/python-web-applications-with-flask-part-iii/
Exemple
Avant:
Après:
Je n'ai pas beaucoup l'autre solution montré, principalement parce que vous devez garder votre mot de passe dans une unité fichier de test (et j'utilise le Flacon-LDAP-Login, donc c'est non évidentes pour ajouter un utilisateur dummy, etc.), donc j'ai piraté autour d'elle:
Dans l'endroit où j'ai créé mon application de test, j'ai ajouté:
Cependant, j'ai fait beaucoup de changements à l'instance de test de la fiole d'application, comme l'utilisation d'une autre DB, où je le construire, l'ajout d'un itinéraire ne rend pas le code sensiblement messier. Obv cette route n'existe pas dans la vraie application.
Puis-je faire:
Rien fait par la suite avec
test_client
doit être connecté.