2010-02-19 4 views
4

Quelle serait la bonne façon de tester une unité d'une action de contrôleur qui effectue une redirection? MISE À JOUR: Je suis un développeur de base sur le projet CFWheels. La raison pour laquelle je pose cette question est actuellement que je travaille sur l'amélioration du framework de test intégré que nous avons et je me demande comment aborder et implémenter quelque chose comme ça dans CFWheels pour permettre aux développeurs de tester leur application plus facilement. .Comment tester unitairement les redirections dans cfwheels

MISE À JOUR: J'ai compris comment tester cela. il semble que nous devrons réécrire un peu les internes du contrôleur de roues pour effectuer la redirection après que l'action soit terminée et après qu'elle soit passée au répartiteur. la seule chose avec cette approche est que n'importe quel code après le redirectTo() serait exécuté SAUF si vous prenez les précautions appropriées avant la main; cela inclut soit de mettre un retour après l'instruction redirectTo() soit de mettre des contrôles conditionnels dans votre action pour isoler le code redirectTo() d'un autre code. Cela implique également de s'assurer que rien d'autre n'est rendu une fois redirectTo() effectuée.

+0

Habituellement, je ne fais que tester le modèle, pas le contrôleur. Quel framework MVC utilisez-vous? – Henry

+0

@henry, j'ai mis à jour la question pour répondre à la vôtre: P – rip747

+0

Vous pouvez envisager de changer le titre de cette question en «Comment faire pour tester les redirections» ou «Comment tester les redirections unitaires dans cfwheels». Ces expressions sont plus susceptibles de correspondre à la requête de recherche d'un utilisateur dans un moteur de recherche, ce qui signifie que cette page aura une plus grande chance d'apparaître comme un résultat supérieur. Cela signifie plus de rep pour vous, et moins de recherche pour les personnes ayant la même question. –

Répondre

2

Les choses de ce genre deviennent beaucoup plus faciles à tester si vous divisez le mécanisme de redirection en plusieurs fonctions: a) une fonction qui détermine l'URL cible et b) une fonction qui effectue la redirection. De cette façon, vous pouvez tester functionA très facilement, et functionA est celui que vous voulez tester quand même. C'est le code que vous avez écrit. C'est où votre vraie logique est. FunctionB n'est pas votre code; c'est ColdFusion courage, et il n'y a pas beaucoup de sens dans le test CFLocation. Si vous avez pour mission d'atteindre une couverture de test de 100%, vous pouvez passer 10 tests pour la fonction A où vous exercez toutes les différentes branches de votre logique, puis un test pour la fonction B qui exerce la redirection de la manière que Terry suggère; donc de cette manière, vous obtenez seulement 1 essai lent au lieu de 10.

Vous pouvez généraliser cette approche pour des utilisations dans d'autres scénarios: systèmes de fichiers, webservices, http, ftp, email, etc: « Extraire les choses que vous pouvez contrôler et je veux tester à partir des choses que vous ne pouvez pas contrôler et que vous ne voulez pas tester "

2

Vous pouvez appeler le contrôleur avec l'URL appropriée en utilisant cfhttp avec le paramètre redirect défini sur false. Ensuite, testez la structure résultante de cfhttp qui en résulte, elle devrait avoir des informations sur l'endroit où la redirection vous mènerait.

+0

Le seul problème que je vois avec cette approche est que le test pourrait être très lent. ce serait mieux si je n'avais pas à émettre une requête http. Une des approches à laquelle je pensais était d'utiliser une variable d'application avec redirectTo() pour retourner les arguments struct pendant le test et contourner le cflocation. mon seul problème est ce qui se passerait s'il y avait une autre logique après le redirectTo(), qui pourrait fonctionner. – rip747

+1

Je dirais que si votre contrôleur effectue une redirection qui prend trop de temps pour un test unitaire, quelque chose est cassé, à moins que je ne comprenne mal ce que vous faites. Dans ce cas, définissez un délai sur cfhttp et échouez si cela prend trop de temps. –

Questions connexes