2013-11-14 4 views
8

Я хочу использовать его для подделки System.Net.Mail.SmtpClient в MS-Test UnitTest. Поэтому я добавил поддельные файлы System.dll. Затем я создаю ShimsContext и StubSmtpClient.Как насмехаться/подделать SmtpClient в UnitTest?

using (ShimsContext.Create()) 
{ 
    StubSmtpClient client = new StubSmtpClient();    
} 

Но что мне с ним делать? Конечной целью было бы написать тест, который ожидает, что метод send вызывается с объектом MailMessage.

+0

Напишите новый класс, который реализует некоторые необходимые методы smtpclient и использует всюду этот интерфейс. Ваш заглушка также будет реализовывать этот интерфейс. – VikciaR

+0

Ты имеешь в виду, что я сделал бы это с другими фальшивыми рамками? Я думал, что это не нужно с MS Fake. – user2900970

+0

http://msdn.microsoft.com/en-us/library/hh549175.aspx. Читайте о Shims. – VikciaR

ответ

6

Это не совсем ответ на ваш вопрос, но альтернативный Подход:

В app.config, настроить параметры SMTP для deliver the mails as files to a local directory вместо. Затем вы можете загрузить файл и проверить содержимое в разделе assert.

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

+2

Спасибо, это были бы решения. Но я подумал, что подходы MS Fakes вроде этого больше не нужны? – user2900970

17

Вы можете создать интерфейс, который будет разоблачать функции, которые будут использоваться с SmtpClient

public interface ISmtpClient 
    { 
     void Send(MailMessage mailMessage); 
    } 

Затем создать конкретный класс, который будет делать реальную работу.

public class SmtpClientWrapper : ISmtpClient 
    { 
     public SmtpClient SmtpClient { get; set; } 
     public SmtpClientWrapper(string host, int port) 
     { 
      SmtpClient = new SmtpClient(host, port); 
     } 
     public void Send(MailMessage mailMessage) 
     { 
      SmtpClient.Send(mailMessage); 
     } 
    } 

В вашем методе тестирования вы можете издеваться над ним и использовать его;

[TestMethod()] 
     public void SendTest() 
     { 
      Mock<ISmtpClient> smtpClient = new Mock<ISmtpClient>(); 
      SmtpProvider smtpProvider = new SmtpProvider(smtpClient.Object); 
      string @from = "[email protected]"; 
      string to = "[email protected]"; 
      bool send = smtpProvider.Send(@from, to); 
      Assert.IsTrue(send); 
     } 
+1

Где находится ваш класс SmtpProvider? Кажется, я не могу это разрешить. –

+2

кажется, что тестируемый класс –

+0

Вы не правильно распоряжаетесь 'SmtpClient' – FCin

2

Другой альтернативой является использование nDumbster:

Install-Package nDumbster

Он работает сервер Smtp в памяти, которые вы можете проверить против. Это превращает его в интеграционный тест, но, как правило, это более высокое значение, чем модульные тесты, так как вы хотите проверить использование SmtpClient.

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