Как вы тестируете функцию отправки почты? - PullRequest
25 голосов
/ 17 июня 2011

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

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

Ответы [ 6 ]

32 голосов
/ 17 июня 2011

Можно сделать следующими способами.

Шаг 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("me@gmail.com", "me@yahoo.com","My Message Subject","This is a test message");
smtp.Send(message);

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

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

12 голосов
/ 17 июня 2011

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

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

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

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

mockProvider.VerifyAllExpectations();
8 голосов
/ 17 июня 2011

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

В своем тесте вы создаете сервер, подобный этому

SimpleSmtpServer server = SimpleSmtpServer.Start(25);

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

server.ReceivedEmail[0]

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

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

1 голос
/ 04 ноября 2012

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

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

1 голос
/ 27 апреля 2012

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

Код просто:

 EmailApprovals.Verify(mail);

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

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

0 голосов
/ 17 июня 2011

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

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

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

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