System.ArgumentNullException
сбрасывается с System.Web.HttpBrowserCapabilities
конструктор, когда mail.Send()
из теста называется. Он требует параметра httpBrowserCapabilities
.Единичная проверка отправки почты почтой и moq
Код я использовал:
EmailModel:
public class EmailModel :Email
{
public EmailModel() :base("EmailModel")
{
}
public string To = "**********@gmail.com";
[Display(ResourceType = typeof(Resource), Name = "Name")]
[Required(ErrorMessageResourceName = "Error_NameRequired", ErrorMessageResourceType = typeof(Resource))]
public string Name { get; set; }
[DataType(DataType.EmailAddress)]
[Display(ResourceType = typeof (Resource), Name = "Email")]
[Required(ErrorMessageResourceName = "Error_EmailRequired", ErrorMessageResourceType = typeof(Resource))]
[RegularExpression("[email protected]+", ErrorMessageResourceName = "Error_EmailWrong", ErrorMessageResourceType = typeof(Resource))]
public string Email { get; set; }
[Display(ResourceType = typeof(Resource), Name = "Topic")]
[Required(ErrorMessageResourceName = "Error_TopicRequired", ErrorMessageResourceType = typeof(Resource))]
public string Topic { get; set; }
[Display(ResourceType = typeof(Resource), Name = "Massage")]
[DataType(DataType.MultilineText)]
[Required(ErrorMessageResourceName = "Error_MassageRequired", ErrorMessageResourceType = typeof(Resource))]
public string Massage { get; set; }
}
Вид сообщения:
@model *******.Models.EmailModel
@{
Layout = null;
}
To: @Model.To
Subject: @Model.Topic
The massage from @Model.Name @Model.Email
Massage text:
@Model.Massage
UnitTest:
public class EmailSetter
{
public const string DefaultName = "NameTest";
public const string DefaultEmail = "[email protected]";
public const string DefaultTopic = "TopicTest";
public const string DefaultMassage = "Massage test.";
public EmailModel GetEmail(string Name = DefaultName, string Topic = DefaultTopic, string Email = DefaultEmail, string Massage = DefaultMassage)
{
EmailModel email = new EmailModel();
email.Name = Name;
email.Topic = Topic;
email.Email = Email;
email.Massage = Massage;
return email;
}
}
[TestClass]
public class MailTests
{
[TestMethod]
public void MailSendWithRightModel()
{
//Arrange
HomeController controller = new HomeController();
Mock<EmailModel> email = new Mock<EmailModel>();
email.Object.Name = EmailSetter.DefaultName;
email.Object.Email = EmailSetter.DefaultName;
email.Object.Topic = EmailSetter.DefaultTopic;
email.Object.Massage = EmailSetter.DefaultMassage;
//Act
controller.Contact(email.Object);
//Assert
email.Verify(mail => mail.Send());
}
}
контроллер из теста:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Contact(EmailModel emailModel)
{
if(ModelState.IsValid)
{
ViewBag.Send = true;
emailModel.Send();
ModelState.Clear();
}
return View(emailModel);
}
То, что я пытался (в методе модульного тестирования):
создания
new HttpBrowserCapabilities
черезnew BrowserCapabilitiesFactory
создание
new HttpBrowserCapabilitiesWrapper
сHttpBrowserCapabilities
объекта
Любые идеи, как сделать код не t o исключить исключение? (Т.е. сделать текущий HttpBrowserCapabilitiesWrapper прибудет существующие HttpBrowserCapabilities) :)
Вы сделали несколько заявлений. Но каков ваш вопрос? – Jasen
Вы пытаетесь отправить фактический адрес электронной почты (интеграционный тест) или намерены высмеять отправку электронной почты? Скорее всего, электронная почта пытается отправить электронное письмо, но правильные зависимости не были настроены для теста. – Nkosi
Я пытаюсь проверить, будет ли вызываться метод Send, если правильная модель передается контроллеру. Я тоже думаю, что проблема связана с зависимостями, которые создаются при запуске обычного приложения. –