Подтвердить что ты не робот

Как вы unit test функция отправки почты

У меня есть функция, которая создает отчет и отправляет его пользователю. То, что я сделал, создает макет для функции электронной почты и проверяет, была ли вызвана функция "отправить" класса электронной почты.

Итак, теперь я знаю, что функция вызывается, но как вы unit test тело функции Send()? Как я могу доказать, что объект и тело верны, и прикрепление прикреплено к письму?

4b9b3361

Ответ 1

Можно выполнить следующие действия.

Шаг 1. Перейдите к файлу Web.Config и добавьте в него следующие теги.

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

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

Шаг 2: Теперь проверьте функциональность отправки электронной почты. Я использовал button_click для проверки этой функции с помощью следующего кода.

SmtpClient smtp = new SmtpClient();
MailMessage message = new MailMessage("[email protected]", "[email protected]","My Message Subject","This is a test message");
smtp.Send(message);

Выход: он создаст файлы .eml внутри папки с randonly сгенерированным именем GUID, которое является адресом электронной почты, который мы видим после его получения. Для меня он создал файл типа c127d1d5-255d-4a5a-873c-409e23002eef.eml в E:\MailTest\ папке

Надеюсь, что это поможет:)

Ответ 2

В своем unit test сообщите своей издевательской структуре ожидающий вызов Send() с определенным текстом тела.

Пример для Rhino Mocks:

var mockMail = MockRepository.GenerateMock<Mail>();
mockMail.Expect( m => m.Send("ExpectedFrom", "ExpectedTo", "ExpectedSubject", "ExpectedBodytext") );

mockMail.Send(...whatever...);

mockProvider.VerifyAllExpectations();

Ответ 3

Недавно я столкнулся с этой проблемой. Попробуйте использовать http://netdumbster.codeplex.com/. Эта библиотека позволяет вам развернуть локальный SMTP-сервер и проверить, какие письма он получил. Все это обрабатывается в памяти AFAIK, поэтому воздействие на ваш тест должно быть минимальным.

В своем тесте вы создаете сервер следующим образом

SimpleSmtpServer server = SimpleSmtpServer.Start(25);

Затем просто измените конфигурацию вашего почтового отправителя, чтобы использовать локальный smtp-сервер (localhost: 25). После отправки почты вы можете получить доступ к ней следующим образом

server.ReceivedEmail[0]

И используйте свойство Data или MessageParts для проверки объекта, тела и вложений.

Надеюсь, это поможет.

Ответ 4

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

Код просто:

 EmailApprovals.Verify(mail);

Это создаст файл .eml и позволит вам просмотреть результат в Outlook. Будущее. Более того, как только вы одобряете результат (переименуйте файл в .approved), тест пройдет без открытия Outlook.

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

Ответ 5

По крайней мере, в моем случае вся отправка электронной почты инкапсулируется в класс MailService - и все вызовы отправки проходят через метод отправки в классе. Метод отправки является виртуальным - и все, что он делает, это новый компонент SmtpClient, отправка почты и т.д. Для моих модульных тестов у меня есть закрытый класс MailServiceMock, который отменяет отправку и ничего не делает. Все другие методы могут быть протестированы, но отправка короткозамкнута.

oleschri предоставил более простой способ сделать это, используя Rhino Mocks (я думаю, что любая смехотворная структура будет работать нормально), однако, если вы не решаетесь ввести другую зависимость, это может привести к тому, что ваши ноги будут влажными, насмехаясь вручную.

Ответ 6

В прошлом я отправил реальные электронные письма, но я использовал шаблон декоратора в реализации EMailGateway по умолчанию.

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

Поскольку я использую контейнер DI, я просто создал шлюз перенаправления в качестве моей реализации IEMailGateway в своих тестах интеграции. Таким образом было отправлено настоящее электронное письмо.