2009-02-15 2 views
51

Мне нужно настроить SMTP-сервер для тестирования моего веб-сайта, который отправляет электронные письма (для подтверждения регистрации и т. Д.).Тестирование SMTP с .net

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

Можно ли рекомендовать SMTP-сервер, который легко настроить?

ответ

7

Я думаю, что сообщение в блоге A Simple SMTP Server Mock for .NET дает вам то, что вам нужно: на SMTP-сервер макет

Макет SMTP-сервер в основном поддельные сервер SMTP, который может быть использован для блока тестирования приложений, которые посылают сообщения электронной почты.

Кроме того, google search for smtp mock server предоставит вам несколько SMTP-серверов для целей тестирования. Как:

  • Dumbster - Java поддельной SMTP-сервер
  • nDumbster - .NET порт Dumbster
+0

Dumbster позволяет вашему модульному тестированию запускать службу SMTP, проверять код отправки, а затем делать утверждения о том, сколько сообщений электронной почты было отправлено, каково их содержимое и т. Д. –

+0

nDumpster, похоже, не поддерживается и очень медленный, поэтому он не подходит для модульных тестов. См. Http://blogs.blackmarble.co.uk/blogs/rfennell/archive/2008/09/27/mocking-out-an-email-server.aspx. –

4

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

EDIT: необходима оболочка (для RhinoMocks, по крайней мере), потому что SmtpClient не вытекает из интерфейса и не имеет виртуальных методов. Если вы используете фальшивую фреймворк, которая может издеваться над классом без виртуальных методов напрямую, вы можете пропустить оболочку и непосредственно вставить SmtpClient.

public class SmtpClientWrapper 
{ 
    private SmtpClient Client { get; set; } 

    public SmtpClientWrapper(SmtpClient client) 
    { 
     this.Client = client; 
    } 

    public virtual void Send(MailMessage msg) 
    { 
     this.Client.Send(msg); 
    } 

    ... 
} 


public class MyClass 
{ 
    private SmtpClientWrapper Client { get; set; } 

    public MyClass(SmtpClientWrapper client) 
    { 
     this.Client = client; 
    } 

    public void DoSomethingAndNotify() 
    { 
     ... 
     this.Client.Send(msg); 
    } 
} 

Испытано (с RhinoMocks) как:

public void DoSomethingAndNotifySendsAMessageTest() 
{ 
    SmtpClientWrapper client = MockRepository.GenerateMock<SmtpClientWrapper>(); 
    client.Expect(c => c.Send(new MailMessage())).IgnoreArguments(); 

    MyClass klass = new MyClass(client); 

    klass.DoSomethingAndNotify(); 

    client.VerifyAllExpectations(); 
} 
+2

Я знаю, что это старый ответ, но я хотел бы указать, что это хорошая идея, но предоставленный код не отражает то, что вы говорите. Обертка не реализует интерфейс или не отменяет виртуальные методы. Лично я предпочитаю использовать интерфейс. Таким образом, этот класс должен реализовать ISmtpClientWrapper, а затем mocks должен быть сгенерирован с типом ISmtpClientWrapper для достижения того, что вам нужно. В общем, я согласен с вашей рекомендацией. Выполнение этого, а не настройка поддельного SMTP-сервера гарантирует, что каждый может получить ваши тесты и запустить их без дополнительной настройки. – jlafay

+0

@jlafay - Я использовал слово * интерфейс * в смысле подписи класса, а не конкретно определен. Я не уверен, что стоит создать реальный интерфейс, если только его будет реализовывать только класс-оболочка. – tvanfosson

+0

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

41

Там также Papercut который является SMTP-сервер, который будет получать сообщения, но не поставить их в любом месте (что позволяет убедиться, что они будут отправлены правильно) , Полученные сообщения отображаются в небольшом графическом интерфейсе и также записываются в каталог.

+3

Papercut переместился с URL-адреса выше в Codeplex: http://papercut.codeplex.com/ – Drarok

+0

Я обновил ссылку, @Drarok. –

2

DevNull SMTP server регистрирует все подробности о связи между клиентом и SMTP-сервером. Похоже, было бы полезно, если бы вы пытались диагностировать, почему ваш код отправки не работал.

Он написан на Java и развертывается как исполняемый банку. Исходный код, похоже, недоступен.

19

Проект smtp4dev - еще один фиктивный SMTP-сервер. Мне это нравится, потому что у него есть простой, простой пользовательский интерфейс, который регистрирует сообщения и позволяет просматривать содержимое последних сообщений. Написан на C# с установщиком MSI. Исходный код доступен.

+0

Мне тоже нравится этот. Голосовать! – granadaCoder

+0

Релиз в ссылке больше не существует, поэтому используйте эту голую ссылку: http://smtp4dev.codeplex.com/ –

+0

Спасибо, @Csaba Toth, я не помню, почему я связан с конкретным выпуском, поэтому я 'изменен на домашнюю страницу проекта. –

0

есть также мой собственный http://ssfd.codeplex.com/, который является эмулятором SMTP с открытым исходным кодом. получает электронную почту и удаляет их в папку, которую можно получить доступ с помощью значка задачи

27

В .NET, SmtpClient может быть настроен для отправки электронной почты с помощью поместив его в каталог пикапа.

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

<configuration> 
    <system.net> 
     <mailSettings> 
      <smtp deliveryMethod="specifiedPickupDirectory"> 
       <specifiedPickupDirectory pickupDirectoryLocation="path to a directory" /> 
      </smtp> 
     </mailSettings> 
    </system.net> 
</configuration> 

MSDN ссылка - App.config mailSettings элемент http://msdn.microsoft.com/en-us/library/w355a94k.aspx

+0

Если вы не в .net 4.5 , будьте осторожны, чтобы указать сетевой хост, или вы получите исключение при утилизации smtpclient - см. [SmtpClient сообщает InvalidOperationException, когда он сразу после отправки почты и пикапа используется] (http://connect.microsoft.com/VisualStudio/feedback/details/539160/smtpclient-reports-invalidoperationexception-when-disposed-immediatelyiatelly-after-delivery-mail-and-pickup-directory-used-used), в частности ответ Raymondr –

+0

@argatxa ответ правильный относительно использования указанного элемента PickupDirectory. Вышеприведенное не совсем корректно, см. Http://msdn.microsoft.com/en-us/library/ms164241.aspx –

7

для .NET ребята там. Держать его просто.

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

Это создаст файл по электронной почте и оставьте его в покое.

<system.net> 
    <mailSettings> 
     <smtp deliveryMethod="SpecifiedPickupDirectory"> 
     <specifiedPickupDirectory pickupDirectoryLocation="\\SharedFolder\MailDrop\" /> 
     </smtp>  
    </mailSettings> 
    </system.net> 
0

Обратите внимание, что класс SmtpClientWrapper предложенного tvanfosson нуждается все важным «виртуальным» ключевым словом в своем заявлении отправляющего метода, в противном случае вы вернулись в той же лодке, пытаясь дразнят SmtpClient непосредственно.

+0

Это должен быть комментарий, а не ответ. –

0

По многим из других предложений бесплатный инструмент я использовал довольно много: http://www.toolheap.com/test-mail-server-tool/

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

3

Я использую Antix SMTP Server For Developers, который так просто, как открытие приложения. Он сохраняет сообщения в папке, и вы можете просматривать их с помощью пользовательского интерфейса. Довольно быстрое/простое решение. Я хотел упомянуть об этом здесь.

Смотрите также: development smtp server for windows

0

Если у вас есть Python установлен, вы можете запустить следующую подкладку, чтобы запустить сервер отладки SMTP в консоли, которая будет выводить сообщения на стандартный вывод:

Суд питона -m smtpd -n -c DebuggingServer локальный: 25

зацепил здесь: http://muffinresearch.co.uk/archives/2010/10/15/fake-smtp-server-with-python/

0

Как отметил Шон Карпентер, Papercut является мощным решение для местного развития. Однако, если вы также запускаете сервер промежуточного тестирования или тестирования, mailtrap.io может быть более простым решением в целом, поскольку вы можете использовать тот же подход для своих разработчиков и промежуточных сред.

Смежные вопросы