Как должен я электронное письмо отправки модульного теста от контроллера?

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

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

Образцовые редакторы связей делают их материал и мой метод действия принимают отправленные данные как модель. Метод действия затем проанализировал бы модель и использовал бы smtp, чтобы послать электронное письмо администратору веб-сайта, сообщающему ему, что кто-то заполнил форму контакта на их сайте.

Теперь для вопроса.... Для тестирования этого, был бы я быть правильным в создании интерфейса IMessageService, который имеет метод, Отправляют (emailAddress, сообщение) для принятия адреса электронной почты и тела сообщения. Реализуйте интерфейс в реальном классе и позвольте тому классу иметь дело с smtp, наполняют и на самом деле отправляют почту.

Если я добавляю интерфейс в качестве параметра к моему конструктору контроллера, я могу затем использовать DI и МОК для введения реального класса в контроллер. Но когда поблочное тестирование я могу создать поддельную или ложную версию своего IMessageService и сделать утверждения на этом.

Причина, которую я спрашиваю, состоит в том, что я видел другие примеры людей генерирующиеся интерфейсы для SmtpClient и затем насмешки это. Есть ли действительно какая-либо потребность пойти, что далеко или разве я не понимаю этот материал?

6
задан Simon Lomax 29 May 2010 в 13:31
поделиться

4 ответа

Вам все равно нужно протестировать свой класс, который вызывает почтовую программу. Я предлагаю вам попробовать и то, и другое понемногу. Обычно я создаю интерфейс IMailClient и оболочку вокруг SmtpClient, которая реализует интерфейс. Используйте (и внедрите) интерфейс в прокси-класс, который знает, как создать сообщение и отправить его (у него может быть несколько методов фабричного типа, которые могут создавать несколько различных типов сообщений). Прокладка вокруг SmtpClient действительно должна быть именно такой, поэтому ее модульное тестирование практически не требуется. Вы можете издеваться над своей прокладкой при тестировании прокси-класса и издеваться над своим прокси-классом при тестировании контроллеров.

2
ответ дан 17 December 2019 в 04:42
поделиться

Описанный вами подход хорошо сработал для меня в прошлом. Я работал над проектом, который взаимодействовал с API веб-службы MS Dynamics CRM. Я хотел провести модульное тестирование своего кода, но у меня не было желания проводить модульное тестирование веб-сервиса. Я следовал точно такому же процессу, как вы описали, но с имитацией веб-службы, а не доставки почты. Это сработало очень хорошо.

1
ответ дан 17 December 2019 в 04:42
поделиться

Вы на правильном пути, именно такой подход вы должны использовать. Возможно, примеры, на которые вы ссылаетесь, - это люди, идущие трудным/неправильным путем... или это примеры того, как можно работать с большой унаследованной базой кода.

Внедрение механизма для доставки сообщения является гибким, и его легко повторно использовать в других сценариях. Одним из таких сценариев является диагностика, если у вас есть dev-сервер, вы, вероятно, не хотите, чтобы он постоянно отправлял почту, переключив инжектированный класс, вы можете вывести его в файл или просто Debug.Write.

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

1
ответ дан 17 December 2019 в 04:42
поделиться

Я думаю, вы на правильном пути. Не беспокойтесь о smtp-серверах или чем-то еще. Просто тестируйте то, что вам нужно. Пусть тесты скажут вам, что вам нужно. Когда вы дойдете до тестирования собственно Send(emailAddress, message), тогда вы сможете побеспокоиться о том, как на самом деле отправить сообщение администратору.

1
ответ дан 17 December 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: