behat

Tester l’envoi de mail avec Behat dans une application Symfony2

Dans la dernière application que je suis en train de développer, un e-mail est envoyé au moment de l’inscription d’un utilisateur, il est donc logique d’ajouter un scénario Behat pour tester cette fonctionnalité. J’entends souvent qu’il n’est pas possible de tester fonctionnellement l’envoi d’email, je vous propose donc un exemple de scénario pour vérifier l’envoi du mail lors de l’inscription de l’utilisateur avec Behat.

Prenons l’étape qui nous interresse dans ce scénario:

Cette étape pose plusieurs problèmes:

  • on doit d’abord être capable de récupérer l’ensemble des mails envoyés lors d’un scénario à un utilisateur
  • on doit identifier les types de mails (registration, confirmation…)

Récupérer l’ensemble des mails

Avec SwiftMailer, il suffit de modifier la configuration (dans le fichier config_test.yml) pour stocker les mails sur le disque au lieu de les envoyer, en utilisant le mode spool de type file.

Lorsque l’on rajoute cette configuration, ou peut récupérer le dossier qui permet de stocker les messages, à partir du paramètre swiftmailer.spool.file.path depuis le container. Par défaut il s’agit du dossier %kernel.cache_dir%/swiftmailer/spool.

Récupérer seulement les mails du scénario en cours

SwiftMailer va écrire un fichier par mail envoyé, pour récupérer uniquement ceux du scénario en cours, il suffit de vider le dossier qui contient ces mails avant le scénario. Pour celà, on peut créer une méthode dans le fichier FeatureContext.php et ajouter une annotation @BeforeScenario sur cette méthode afin que cette dernière soit executée avant chaque scénario.

Identifier les type de mails

Pour identifier un mail, on ne peut pas se fier à son contenu, car celui-ci peut être internationalisé (donc traduit). J’ai choisi d’identifier les mails en ajoutant un en-tête personnalisé, car c’est une méthode très simple a appliquer avec SwiftMailer, il suffit d’une seul ligne de code. Cette méthode n’impacte en rien l’utilisateur qui recevra cet email.

Le code

Bien entendu, il faut écrire une étape personnalisée avec Behat (custom step) qui va faire tout le travail.

Conclusion

Et voilà une méthode simple et propre pour vous permettre de vérifier que votre application a bien donné l’ordre d’envoyer le mail.

Related posts:

7 thoughts on “Tester l’envoi de mail avec Behat dans une application Symfony2

  1. Salut, très sympa ! Je ne n’avais jamais creusé la question et avais tout bonnement laissé tombé les tests Behat concernant les emails envoyés, Ça semble être une bonne approche, j’essaierai dans mon prochain projet. Du coup une petite entrée dans le cookbook sur le sujet serait utile. ;)

  2. Merci pour cet tuto très pratique, qui m’évite de faire ça à l’aide du profiler. Au passage, cela ne fonctionne pas si on utilise le parametre delivery_address de swiftmailer. Il faut du coup récupérer les recipients comme ceci :
    $recipients = array_keys($message->getHeaders()->get(‘X-Swift-To’)->getFieldBodyModel());

  3. Utilisez simplement le logger: “swiftmailer.mailer.default.plugin.messagelogger”.

    C’est quand même beaucoup plus simlple :) .

  4. @Nek sauf que dans mon cas je test avec le tag @javascripts, et donc je n’ai pas accès au code au moment de l’éxecution, sinon j’aurai utilisé ce plugin ou directement le profiler de Symfony2

  5. Chez Wisembly on a eu des soucis avec cette méthode de test. On a eu des fails aléatoires sur Travis.

    Il semblerait que Behat cherche à tester la présence de fichiers dans le spool sans que ceux-ci n’aient eu le temps de se créer.

    Nous avons créé un service de spool personnalisé qui enregistre les Swift_Message dans Redis plutôt que le FileSpool classique.

  6. Dans la methode getSpoolDir
    return $this->kernel->getContainer()->getParameter(‘swiftmailer.spool.file.path’);
    retourne une erreur “The parameter “swiftmailer.spool.file.path” must be defined. ”
    return $this->kernel->getContainer()->getParameter(‘swiftmailer.spool.default.file.path’);
    fonctionne.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>