Ниже приведен мой метод тестирования, который просто вставляет данные в базу данных, если все работает нормально.
[TestMethod]
public void PostActivationRequest_Returns_Created_On_Successful_Request()
{
ActivationRequestWM activationRequestWM = new ActivationRequestWM
{
EMail = "unitTest@gmail.com",
ConfirmationTypeID = 1
};
var testResponse = _userController.PostActivationRequest(activationRequestWM);
Assert.AreEqual(HttpStatusCode.Created, testResponse.StatusCode);
}
Но этот PostActivationRequest
также отправляет электронные письма до завершения запроса.
public void PostActivationRequest(ActivationRequestWM model)
{
//model validation stuff
var activationCode = CreateUniqueActivationCodeForCreateAccount(model.EMail);
var newActivationCodeRequest = new UserActivationRequest
{
EMail = model.EMail,
MobileNumber = model.MobileNumber,
ConfirmationType = model.ConfirmationTypeID,
CreationTime = DateTime.Now,
ActivationCode = activationCode,
IsUsed = false,
IsActive = true,
};
INotification notification;
INotificationBaseModel notificationModel;
switch (model.ConfirmationTypeID)
{
case AccountConfirmationType.SMS:
//SMS sender
break;
default:
notification = NotificationFactory.GetNotification(NotificationType.Mail);
notificationModel = new MailNotificationModel
{
SendTo = model.EMail,
Title = "Activate Your Account",
Message = "Your Verification Code is " + activationCode
};
break;
}
using (TransactionScope transaction = new TransactionScope())
{
try
{
if (previousRequest != null)
{
_userActivationRequestOperations.UpdateUserActivationRequest(previousRequest);
}
_userActivationRequestOperations.InsertUserActivationRequest(newActivationCodeRequest);
notification.Send(notificationModel); //this code triggers e-mail sender
transaction.Complete();
}
catch (DatabaseOperationException)
{
//throw exceptions
}
}
}
На самом деле, метод хорош, потому что он работает, когда я отправляю запрос через Fiddler.Но когда я отлаживаю вышеприведенный тестовый метод, у меня возникает проблема с client.ServicePoint
, которая выдает исключение типа System.InvalidOperationException
. Я также вижу, что некоторые другие свойства SmtpClient, такие как Host
, Port
,Credentials
и TargetName
имеют разные значения, когда я прихожу из метода тестирования (т. Е. Port
это 25, когда я прихожу из метода тестирования, но это 587, если я звоню из Fiddler).
Когда яВскоре я вижу, что мне нужно подделать SmtpClient, как будто он работает нормально (и это так), и я должен сосредоточиться на других вещах, которые ожидаются от метода, но не могут достичь, чтобы издеваться над SmtpClient.
NotificationFactory
метод, как показано ниже.
public static class NotificationFactory
{
public static INotification GetNotification(NotificationType type)
{
switch (type)
{
case NotificationType.Mail: return new MailNotification();
default:
throw new Exception("Notification not registered on system");
}
}
public static INotification GetSmsNotification(SmsProviderType type)
{
switch (type)
{
//SMS codes
}
}
}
Наконец, MailNotification
класс, как показано ниже.
public class MailNotification : INotification
{
public void Send(INotificationBaseModel notification)
{
try
{
SmtpClient client = new SmtpClient();
MailMessage mailMessage = new MailMessage();
mailMessage.To.Add(notification.SendTo);
mailMessage.Subject = notification.Title;
mailMessage.Body = notification.Message;
mailMessage.IsBodyHtml = true;
client.Send(mailMessage);
}
catch (Exception ex)
{
throw new Exception("");
}
}
}
Заранее спасибо!