Une solution consiste à créer un script qui restitue tous les modèles en fonction d'un dictionnaire d'entrée de valeurs de test de variables.
La logique principale pour récupérer la liste des variables définies dans les modèles est la suivante:
from django.template.loader import get_template
def extract_required_vars(node):
if not hasattr(node, 'nodelist'):
return []
var_names = []
for child_node in node.nodelist:
if isinstance(child_node, VariableNode):
var_names.append(child_node.filter_expression.token)
elif isinstance(child_node, ForNode):
var_names.append(child_node.sequence.var.var)
elif isinstance(child_node, ExtendsNode):
template = get_template(child_node.parent_name.var)
var_names.extend(extract_required_vars(template))
elif isinstance(child_node, IncludeNode):
template = get_template(child_node.template.var)
var_names.extend(extract_required_vars(template))
var_names.extend(extract_required_vars(child_node))
return var_names
required_vars = extract_required_vars(get_template('index.html'))
Le script vérifie ensuite que les variables définies dans les modèles sont soit dans les paramètres du projet ou dans le dict fourni par l'utilisateur comme entrée de test.
/path/to/project/templates/templates/allusers.html
-> ok: users, STATIC_URL
/path/to/project/templates/entrer-en-contact.html
-> ok: contactform, STATIC_URL
/path/to/project/templates/dest-summary.html
-> ok: STATIC_URL
-> missing: dest_username
Plus de détails in this blog post.
Merci :) Je vais y jeter un coup d'oeil. J'ai vu le lien de l'extrait avant, mais le reste est nouveau pour moi (et j'aime le concept de test axé sur la stupidité: D). Oui, je suppose que "tous les scénarios possibles" demande trop - l'utilisation de flatpages peut introduire beaucoup de code HTML invalide dans un site. Cependant, je suis toujours curieux de savoir s'il y a des solutions dans la veine manage.py test app_name et comment la praticité de cette approche par rapport à l'approche middleware compare. Aimez votre réponse si :) –
Bien sûr, pliez-le dans votre processus de test. Je ne sais pas si quelqu'un a fait le dur travail, mais je suppose que vous avez besoin d'un moyen de passer par vos urls.py' et générer autant d'URL possibles pour le site que vous le pouvez. Ensuite, vous pouvez utiliser [le client de test Django intégré] (http://docs.djangoproject.com/fr/dev/topics/testing/#module-django.test.client) pour récupérer toutes ces URL, et [quelque chose sinon pour les valider] (http://stackoverflow.com/questions/35538/validate-xhtml-in-python). –
Merci, je pense que vos deux réponses sont tout ce dont j'ai besoin :) Maintenant c'est à moi d'essayer ce qui fonctionne le mieux pour moi et dans quelles situations :) –