2016-10-31 35 views
1

System.ArgumentNullExceptionSystem.Web.HttpBrowserCapabilities構造函數時拋出mail.Send()從測試調用。它需要httpBrowserCapabilities參數。單元測試的郵件與郵政發送和最小起訂量

代碼我已經使用:

EmailModel:從測試

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

控制器::

@model *******.Models.EmailModel 
@{ 
    Layout = null; 
} 
To: @Model.To 
Subject: @Model.Topic 

The massage from @Model.Name @Model.Email 
Massage text: 
@Model.Massage 

單元測試:

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; } 
} 

消息的查看

[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):)

+2

您已經做了幾個聲明。但你的問題是什麼? – Jasen

+1

你是想發送一封真正的電子郵件(集成測試),還是試圖模擬發送電子郵件?很可能電子郵件正在嘗試發送電子郵件,但沒有爲測試配置適當的依賴關係。 – Nkosi

+0

我想測試是否將調用發送方法,如果正確的模型被給予控制器。我也認爲這個問題出現在正常應用程序啓動時創建的依賴中。 –

回答

1

來源:Postal Unit Testing

當使用郵政單元測試代碼,您可能要驗證 電子郵件將被髮送,沒有實際的發送。

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)); 
    } 
} 
+0

是的,我應該更好地閱讀文檔。如果有人會使用我的代碼和這個答案代碼:var email = EmailSetter.GetEmail();應改爲EmailModel email =(new EmailSetter())。GetEmail(); –

+1

思想是一種靜態的工廠方法。固定。 – Nkosi