SmtpClient ServicePoint - исключение при тестировании - PullRequest
0 голосов
/ 15 сентября 2018

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

    [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("");
        }
    }
}

Заранее спасибо!

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