1

System.ArgumentNullException从测试调用System.Web.HttpBrowserCapabilities时从构造函数中抛出。mail.Send()它需要httpBrowserCapabilities参数。

我用过的代码:

电子邮件型号:

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(".+@.+", 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

单元测试 :

public class EmailSetter
{
    public const string DefaultName = "NameTest";
    public const string DefaultEmail = "EmailTest@domaintest.test";
    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);
}

我尝试过的(在单元测试方法中):

  1. new HttpBrowserCapabilities通过创建new BrowserCapabilitiesFactory

  2. new HttpBrowserCapabilitiesWrapperHttpBrowserCapabilities 对象创建

任何想法如何使代码不抛出异常?(即让当前的 HttpBrowserCapabilitiesWrapper 获取现有的 HttpBrowserCapabilities):)

4

1 回答 1

1

资料来源:邮政单元测试

在对使用 Postal 的代码进行单元测试时,您可能希望验证是否会发送电子邮件,而不是实际发送它。

Postal 提供了一个接口IEmailService和一个实现 EmailService,它实际上发送电子邮件。

假设您使用某种 IoC 容器,请将其配置为将一个注入 IEmailService到您的控制器中。

然后使用该服务发送电子邮件对象(而不是调用 Email.Send())。

public class HomeController : Controller {

    readonly IEmailService emailService;

    public HomeController(IEmailService emailService) {
        this.emailService = emailService;
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Contact(EmailModel email) {
        if(ModelState.IsValid) {
            emailService.Send(email);
            ViewBag.Send = true;
            ModelState.Clear();
        }
        return View(email);
    }
}

通过创建接口的模拟来测试这个控制器IEmailService

[TestClass]
public class MailTests {
    [TestMethod]
    public void MailSendWithRightModel() {
        //Arrange
        var mockService = new Mock<IEmailService>();
        var controller = new HomeController(mockService.Object);
        var email = new EmailSetter().GetEmail();

        //Act
        controller.Contact(email);

        //Assert
        mockService.Verify(m => m.Send(email));
    }
}
于 2016-10-31T17:42:39.433 回答