Как выполнить тестовую отправку электронной почты? - PullRequest
22 голосов
/ 10 марта 2011

Я хотел бы протестировать свою функцию отправки электронной почты с использованием платформы .NET (C #) или любой совместимой библиотеки, какие-либо предложения, как это сделать?

Ответы [ 8 ]

31 голосов
/ 10 марта 2011

Если вам нужна только тестовая отправка электронной почты, вы можете настроить свой файл .config следующим образом

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="C:\TempMail" />
        </smtp>
    </mailSettings>
</system.net>

С этими настройками ваши сообщения не отправляются по сети, ноудаляются как физические файлы с расширением .eml в папке, настроенной вами в атрибуте pickupDirectoryLocation.Вы можете проверить их с помощью классов в пространстве имен System.IO.

Документация MSDN здесь

19 голосов
/ 10 марта 2011

Я не согласен с представлением о фактической отправке электронного письма во время модульного тестирования.Это создает много проблем для IMO и идет вразрез с тем, о чем должно быть юнит-тестирование.

В моем приложении у меня есть интерфейс IMailManager с такими методами, как SendPasswordResetEmail(string emailAddress) и тому подобное.Я высмеиваю этот объект во время модульного тестирования и просто проверяю, чтобы мои компоненты вызывали правильный метод почтового менеджера.

Моя фактическая производственная реализация MailManager обычно использует System.Net.Mail.SmtpClient внутри, что вам не нужно тестировать.Позвольте Microsoft проверить это.Все, что вам нужно сделать, это убедиться, что ваши настройки SMTP настроены правильно при развертывании, что не должно быть проблемой модульного тестирования.

Если вам нужно протестировать сам почтовый компонент, т. Е. Убедиться, что он генерирует правильное тело сообщения и т. П., Я бы рекомендовал смоделировать то, что необходимо для изоляции этой функциональности в автономном модульном тесте.1011 *

12 голосов
/ 27 мая 2012

Вам не нужно проверять реальную электронную почту отправка функция; это часть .NET Framework, и она уже протестирована.

Для юнит-теста вам понадобится электронная почта создание бизнес-логика. Инкапсулируйте это в такой сервис:

public interface IPasswordResetEmailCreator
{
    MailMessage Create(string emailAddress);
}

И реализовать это. Затем напишите модульный тест для этой реализации и убедитесь, что возвращаемое MailMessage соответствует вашим требованиям.

Пример реализации этого модульного теста с использованием SpecsFor framework:

public class PasswordResetEmailCreatorSpecs
{
    public class given_a_registered_user : SpecsFor<PasswordResetEmailCreator>
    {
        private string _emailAddress;
        private MailMessage _email;

        protected override void Given()
        {
            _emailAddress = "user@example.org";
        }

        protected override void When()
        {
            _email = SUT.Create(_emailAddress);
        }

        [Test]
        public void then_the_body_must_contain_the_reset_uri()
        {
            _email.Body.ShouldContain("/Password/Reset/");
        }

        [Test]
        public void then_the_email_must_be_for_the_user()
        {
            _email.To[0].Address.ShouldEqual(_emailAddress);
        }

        [Test]
        public void then_the_subject_must_be_the_expected()
        {
            _email.Subject.ShouldEqual("Your email reset link");
        }
    }
}
0 голосов
/ 06 ноября 2017

Мой быстрый и грязный подход был очень похож на топ-ответ от whylee , за исключением того, что он не требует касания каких-либо файлов конфигурации (потому что мне могут потребоваться разные настройки для разных юнит-тестов)

в вашем коде отправки электронной почты

if (ConfigurationManager.AppSettings["smtpDir"] == null)
    smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
else
{
    smtp.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
    smtp.PickupDirectoryLocation = ConfigurationManager.AppSettings["smtpDir"];
}

В вашем юнит-тесте

ConfigurationManager.AppSettings["smtpDirectory"] = dir;

//do some testing then change it back

ConfigurationManager.AppSettings["smtpDirectory"] = null;

PS. Я знаю все недостатки, но на всякий случай кому-то это нужно ...

0 голосов
/ 18 ноября 2015

Если вы хотите проверить это, я бы порекомендовал посмотреть на mail4net: www.mail4net.com

Это коммерческий продукт, но он позволяет отправлять электронную почту с использованием поддельного SMTP-сервиса, а затем запрашивать поддельный.

// Create Mail4Net FakeClient.
var client = new Mail4Net.Client.FakeClient();

// Send email.
client.Send(from, to, subject, body);

И затем вы можете запросить клиента:

// Count the number of emails sent.
var count = client.Count();

// Get first email.
var message = client[0];
0 голосов
/ 27 апреля 2012

Существует очень простой способ протестировать содержимое электронной почты в сертификационных тестах (www.approvaltests.com или nuget).Код просто:

EmailApprovals.Verify(mail);

Это создаст файл .eml и позволит вам просмотреть результат в Outlook.Кроме того, как только вы утвердите результат (переименуете файл в .approved), тест пройдет без открытия Outlook.(Этот процесс очень похож на тот, что упоминал @whyleee, но не использует файл конфигурации.)

Я опубликовал короткое видео о процессе на YouTube .

0 голосов
/ 10 марта 2011

Я бы, вероятно, написал действительно тонкий слой абстракции поверх класса .NET SmtpClient. Затем я мог бы заменить классом для модульных тестов. Конечно, вы не сможете выполнить модульное тестирование оболочки, но в любом случае это должно быть практически тривиально и вряд ли когда-либо изменится.

0 голосов
/ 10 марта 2011

У меня обычно есть настройка «OverrideEmailAddress», которую я устанавливаю для своей собственной электронной почты, и тогда любые тесты электронной почты, которые вы запускаете, не попадут к вашему клиенту или кому бы то ни было, к которому они изначально пойдут. У меня есть вспомогательный метод, через который я отправляю все электронные письма, и этот метод будет использовать настройку, если она существует. При желании вы можете добавить в конец письма, кем был бы первоначальный получатель.

Если вам необходимо подтвердить, что электронное письмо было получено, вам нужно будет написать код, чтобы проверить адрес электронной почты, а затем подтвердить, что сообщение верное.

Не уверен, что это ты имеешь в виду или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...