Se moquant de Symfony2 de la demande et de la session de PHPUnit
J'ai une classe qui nécessite la Symfony2
service @request_stack
qui retourne une instance de Symfony\Component\HttpFoundation\RequestStack
. - Je l'utiliser pour récupérer de POSTE et d'OBTENIR des valeurs.
Et aussi ma classe utilise Symfony\Component\HttpFoundation\Session
de Request->getSession()
lequel il lance un appel pour obtenir de la session en cours.
Droit maintenant, ma classe a une méthode qui ressemble à quelque chose comme ceci:
class MyClass {
public function doSomething() {
//Get request from request stack.
$Request = $this->RequestStack->getCurrentRequest();
//Get a variable from request
$var = $Request->request->get('something');
//Processes $var into $someprocessedvar and lets say it's equal to 3.
//Set value to session.
$this->Request->getSession()->set('somevar', $someprocessedvar);
}
}
J'ai besoin d'être en mesure de:
- Se moquer de
RequestStack
. - Obtenir
Request
deRequestStack
- Obtenir
Session
deReques
t;
Avec tout ce que dit comment puis-je tester que MyClass
réussi à mettre la valeur attendue dans la session?
OriginalL'auteur Tek | 2014-05-23
Vous devez vous connecter pour publier un commentaire.
Pas tout le code est intéressant de tests unitaires. Habituellement, c'est un indicateur que votre code peut être simplifié. Lorsque vous code de test unitaire qui est un peu complexe, les tests peuvent devenir un fardeau et, normalement, il serait préférable de faire une intégration de bord-à-bord de test dans ces cas. Il n'est également pas clair dans votre exemple de la façon dont votre classe devient le
RequestStack
donc je suppose qu'il a été injecté dans__construct
.Avec cela dit, voici comment vous pouvez tester ce code:
Cela devrait vous donner un point de départ, mais méfiez-vous d'avoir un mur d'objets fantaisie dans vos tests parce que de très légères modifications pour les détails de mise en œuvre peut entraîner l'échec des tests, même si le comportement est toujours correct et c'est quelque chose que vous voulez éviter, autant que possible, de sorte que les tests ne sont pas coûteux à maintenir.
Edit: j'ai pensé un peu plus sur votre question et a constaté que, en général, vous pouvez injecter de la Session comme une dépendance. Si c'est possible dans votre cas d'utilisation, elle permettrait de simplifier les tests de beaucoup.
OriginalL'auteur Kevin Archer
Il est difficile d'imaginer une situation où vous auriez à être aux prises avec des GET/POST paramètres à l'intérieur d'une unité testée en classe. Ont le Contrôleur de traiter les requêtes HTTP et les sessions (c'est à peu près qu'ils sont là), et passer les variables en bas dans les catégories pertinentes pour traiter le reste.
Cela étant dit, Kevin réponse est une solution possible si vous voulez aller dans cette voie.
dans ce cas, ne peut pas juste se moquer de la session et toutes les autres dépendances de vos besoins de la classe. Le conteneur ne doit jamais être utilisé dans un test unitaire, car comment pouvez-vous vous moquez de dépendances résolues en dehors du conteneur?
OriginalL'auteur r.bilgil
Vous n'avez pas besoin de se moquer de
RequestStack
, c'est super simple de la classe. Il vous suffit de créer un faux demande et de le pousser à. Vous pouvez aussi simuler la session.Mais en termes d'analyses, d'avoir à déconner avec le fonctionnement interne d'une classe n'est pas un bon signe. Peut-être que vous pouvez créer une classe de gestionnaire pour encapsuler la logique que vous avez besoin de la demande de la pile de sorte que vous pouvez tester plus facilement.
OriginalL'auteur thiago marini
Selon cette: http://api.symfony.com/2.4/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.html
J'ai eu à travailler à quelque chose comme:
Un seul test par type d'objet dans mon cas puisque je ne suis qu'un test si le nom de la session est correct et la récupération/stockage de l'objet correctement dans la session.
CompanyMapper
classe utilise la session pour stocker l'objet de la société parmi d'autres de session/l'application des fonctions connexes.OriginalL'auteur Tek
Ceux qui viennent de Google comme moi veut savoir comment se moquer de demande de contenu, c'est aussi simple que:
Comme vous pouvez le voir, vous pouvez exécuter une commande réelle qui utilise
$request->getContent()
J'espère que cela aide quelqu'un.
OriginalL'auteur Edward