Bonjour,

Il y a une question que je me pose souvent. On dit souvent que ce n'est pas
nécessaire de charger rails entièrement pour tester certaines classes.
Personnellement, j'utilise spork. Rails est chargé en permanence et un test
ne recharge pas mon code à chaque fois. Mes tests sont très rapide.

En ce qui concerne l'extraction de la création d'un utilisateur dans un
service, j'avoue que je n'aime pas trop ça. Pour moi, je garderais
l'interface à la base de données dans un modèle. Ceci dit, je suis ouvert à
toute proposition. Si vous pouvez m'envoyer des articles pour me contre
dire je suis tout ouvert. J'en ai déjà vu un là dessus mais j'ai pas
accroché à l'idée.

Ensuite, pour moi, un test unitaire doit être unitaire et doit donc stubber
tout ce qui n'est pas de la responsabilité de l'objet qu'il test. Je suis
le Single Responsability Principle.

Je suis peut être un peu hors champs mais j'avoue ne pas comprendre
pourquoi créer un service pour la création d'un modèle et ne pas utiliser
un modèle avec un ORM classique.

Le 1 février 2013 09:13, Olivier El Mekki <[email protected]> a écrit :

> Hello,
>
> Ces service objects sont extraits de models, ça ne me choque donc pas,
> ici, de les laisser interagir avec la db sans ne rien stubber, comme ce
> serait le cas si tu testais directement le model.
>
> Il est vrai que dans les tests unitaires, nous sommes censé stubber les
> dépendences d'une classe. Mais je ne suis pas certain que nous puissions
> vraiment parler de dépendence en ce qui concerne User, ici : ça ne
> serait probablement pas excessif de voir en UserCreate une extraction
> d'une partie fondamentale de User (et donc : de ne pas traiter User
> comme une dépendence, mais comme un contexte).
>
> C'est d'autant plus important que tu vas sûrement, à un moment ou un
> autre, vouloir tester des validations. Ça n'aurait plus vraiment de sens
> en forçant leur résultat.
>
>
> On 14:52 Fri 01 Feb     , Cyril Mougel wrote:
> > Bonjour,
> >
> > Suite au podcast Parlons Ruby avec Jean-michel Garnier (
> > http://parlonsruby.com/pr006comment-je-teste-avec-jean-michel-garnier/
> > ), j'ai voulu avoir un retour d'expérience de personne ayant réussi ce
> > genre de technique.
> >
> > De plus en plus, les développeurs rails commence à avoir une couche
> > "service" qui permet de limiter son controller et ses models. Un Thin
> > Controller / Thin Model. De plus dans une logique compléte de test, il
> > est conseiller de faire du fast test. Le require de rails prenant pas
> > moins de 5 secondes, il peut être interessant de l'éviter. Pareil pour
> > les accés en BDD qui prendre quelque 100aine de milliseconde en plus.
> >
> > Je suis moi en train de
> > commencer cette démarche. Mais je me heurte assez vite à un problème.
> > C'est que ma couche service étant tellement lié à ma couche
> > model que je dois très vite require 1 ou plusieurs models. De même, si
> > je ne require pas ces models et ne passe que par des mocks, je me
> > retrouve à avoir un test qui ne comprend que des stub pour verifier
> > que ma methode appele bien les methodes de mes objets. Donc l'intérêt
> > est très faible car aucune valeur ajoutée.
> >
> > Pour expliquer cela rien ne vaut mieux que du code. Cas simple, mais
> > qui peut être globalement correcte.
> >
> > J'ai une class UserCreate qui me permet de créer un utilisateur avec
> > son adresse.
> >
> >
> https://gist.github.com/4691019/9d449582d9522e867ea4af6dfe4d6e66965c1041#file-user_create-rb
> >
> > On commence ensuite à lui mettre les specs adéquates ( bien sur il
> > faut le faire avant )
> >
> >
> https://gist.github.com/4691019/ed7a66f305002177bd8abf68f8885234507f02a4#file-user_create_without_model_require_spec-rb
> >
> > Avec ce genre de test, je change un tout petit peu mon implémentation
> > dans ma classe et je dois la changer dans mon test. Je stub 80% des
> > methodes appeler par ma classe. Personnelement, je ne trouve pas cela
> > utile.
> >
> > Donc, on se dit qu'il faut stuber uniquement la persistence en BDD. On
> > obtient ainsi le test suivant :
> >
> >
> https://gist.github.com/4691019#file-user_create_with_stub_persistence_spec-rb
> >
> > On require un peu plus de chose car on require 3 nouveaux fichier dans
> > notre exemple, mais on limite globalement la persistence, mais sans
> > aucune certitude de persistence réel sans compter le cas ou demain
> > l'API de notre objet User change.
> >
> > Enfin on arrive à la solution "bourrine" le test d'integration :
> >
> > https://gist.github.com/4691019#file-user_create_integration_spec-rb
> >
> > Cette fois-ci on est sur que notre objet est persisté. Par contre il
> > faut avoir require toute la stack rails. Le test est plus long à
> > executer et le require aussi.
> >
> > Je voulais avoir des retours sur ces 3 exemples.
> >
> > Doit-on tester le 3 ? juste 2 et 3, ou juste 1 et 3 ? Je suis
> > actuellement dans de
> > grande phase de réflexion de ce coté là, car je n'arrive pas à me
> > décider sur le bon process. Je suis ouvert à tous commentaires.
> >
> > Merci
> >
> > --
> > Cyril Mougel
> > http://blog.shingara.fr
> >
> > --
> > --
> > Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance"
> de Google Groups.
> > Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse
> [email protected]
> > Pour résilier votre abonnement envoyez un e-mail à l'adresse
> [email protected]
> > ---
> > Vous recevez ce message, car vous êtes abonné au groupe Google
> Groupes Railsfrance.
> > Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le
> concernant, envoyez un e-mail à l'adresse
> [email protected].
> > Pour plus d'options, visitez le site
> https://groups.google.com/groups/opt_out .
> >
> >
>
>
> --
> Olivier El Mekki.
>
> --
> --
> Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de
> Google Groups.
> Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse
> [email protected]
> Pour résilier votre abonnement envoyez un e-mail à l'adresse
> [email protected]
> ---
> Vous recevez ce message, car vous êtes abonné au groupe Google
> Groupes Railsfrance.
> Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le
> concernant, envoyez un e-mail à l'adresse
> [email protected].
> Pour plus d'options, visitez le site
> https://groups.google.com/groups/opt_out .
>
>
>

-- 
-- 
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
[email protected]
Pour résilier votre abonnement envoyez un e-mail à l'adresse 
[email protected]
--- 
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes 
Railsfrance.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, 
envoyez un e-mail à l'adresse [email protected].
Pour plus d'options, visitez le site https://groups.google.com/groups/opt_out .


Répondre à