Je commence à commencer avec des tests unitaires et d'essayer de faire du TDD. J'ai lu un petit peu de choses sur le sujet et j'ai écrit quelques tests. Je veux juste savoir si ce qui suit est la bonne approche. p>
Je veux ajouter l'installation habituelle "Contactez-nous" sur mon site Web. Vous connaissez la chose, l'utilisateur remplit un formulaire avec leur adresse e-mail, entre un message bref et frappe un bouton pour publier le formulaire. P>
Les liants de modèle font leurs affaires et ma méthode d'action accepte les données publiées comme modèle. La méthode d'action suppriperait ensuite le modèle et utiliserait SMTP pour envoyer un courrier électronique à l'administrateur du site Web l'infomérant que quelqu'un a rempli le formulaire de contact sur leur site. P>
Maintenant pour la question .... afin de tester cela, aurais-je eu raison de créer une interface imessationferservice em> qui a une méthode Envoyer (e-mailAddress, message) em> accepter l'adresse e-mail et le corps du message. Implémentez l'intégration dans une classe de béton et laissez cette classe traiter avec SMTP Stuff et en réalité envoyer le courrier. P>
Si j'ajoute l'interface sous forme de paramètre sur mon constructeur de contrôleur, je peux ensuite utiliser DI et IOC pour injecter la classe de béton dans le contrôleur. Mais lorsque des tests unitaires, je peux créer une version fausse ou simulée de mon imessaféservice em> et de faire des affirmations à ce sujet. P>
La raison pour laquelle je demande est que j'ai vu d'autres exemples de personnes générant des interfaces pour SMTPCLIENT, puis moquez cela. Y a-t-il vraiment besoin d'aller aussi loin ou je ne comprends pas ce genre de choses? P>
4 Réponses :
L'APRACH que vous décrivez a bien fonctionné pour moi dans le passé. J'ai travaillé sur un projet qui a interfacé avec l'API de service Web MS Dynamics CRM. Je voulais appuyer sur mon code mais je n'avais aucun désir de tester le service Web. J'ai suivi le processus exact que vous décrivez mais avec le service Web moqué plutôt que la livraison du courrier. Cela a très bien fonctionné. p>
Vous devez toujours tester votre classe qui invoque le mailer. Je suggère que vous voudrez peut-être faire un peu des deux. Je crée généralement une interface imailclient et une enveloppe autour de SmtpClient qui implémente l'interface. Utilisez (et injecter) l'interface dans une classe proxy qui sait construire le message et l'envoyer (il peut avoir plusieurs méthodes de type usine pouvant construire plusieurs types de messages différents). La carénage autour de la SMTPCLIPT devrait vraiment être exactement cela, il y a donc peu de besoin de tester l'unité. Vous pouvez vous moquer de votre cale lorsque vous testez la classe de proxy et vous moquez de votre classe de proxy lorsque vous testez vos contrôleurs. P>
Je suis d'accord, et cela sera probablement utile dès que vous aurez besoin de cet imailClientasync T que vous pouvez échanger.
Vous êtes sur la bonne voie, c'est l'approche que vous devriez utiliser. Probablement les exemples que vous parlez, est que les gens y vont la solution difficile / incorrect ... ou sont des exemples sur la manière dont vous pouvez faire face à une grande base de code héritée. P>
injecter le mécanisme pour livrer le message est flexible et sa réutilise facilement dans d'autres scénarios. Un de ces scénarios est des diagnostics, si vous avez un serveur DEV, vous ne voulez probablement pas que ce soit sur les mails tout le temps, en activant la classe injectée, vous pouvez l'avoir sortie à un fichier ou simplement debug.write. P >
ps. Il est toujours recommandé de tester votre classe SMPDeliver, mais ce serait un test d'intégration ciblé que vous pouvez faire sur cette classe de manière indépendante du reste du code. P>
Je pense que vous êtes sur la bonne voie. Ne vous inquiétez pas pour les serveurs SMTP ou quoi que ce soit d'autre. Juste unitaire testez ce dont vous avez besoin. Laissez les tests vous dire ce dont vous avez besoin. Lorsque vous arrivez au test de l'envoi de réel (e-mailAddress, message) code>, vous pouvez vous inquiéter de la manière dont vous allez en envoyer le message à l'administrateur. P>