2011-12-14 9 views
6

Bất cứ ai có thể vui lòng cho biết làm thế nào để giả lập một bài đăng hình thức MVC bằng cách sử dụng Moq?Làm thế nào để giả lập mẫu MVC POST với Moq

Tất cả những gì tôi muốn là kiểm tra đơn vị phương pháp của mình dựa trên một số bài đăng biểu mẫu khác nhau.

Tôi đã cố gắng sử dụng Google cho điều này và không có hướng dẫn từ trên xuống dưới.

Cảm ơn

EDIT: thêm mã

[TestMethod] 
    public void SubscriptionControllerTest() 
    { 
     var subscriptionViewModel = new SubscriptionViewModel(); 

     //HTTP REQUEST SET UP 
     var httpRequest = new Mock<HttpRequestBase>(); 

     httpRequest.Setup(r => r.Path).Returns("/Subscription/SendEmail"); 

     httpRequest.Setup(r => r.Form).Returns(delegate() 
     { 
      var nv = new NameValueCollection(); 
      nv.Add("FirstName", "John"); 
      nv.Add("LastName", "Smith"); 
      nv.Add("Email", "[email protected]"); 
      nv.Add("Comments", "Comments are here..."); 
      nv.Add("ReceiveUpdates", "true"); 
      return nv; 
     }); 


     //HTTP CONTEXT SET UP 
     var httpContext = new Mock<HttpContextBase>(); 

     httpContext.Setup(c => c.Request).Returns(httpRequest.Object); 

     var subscriptionController = new Mock<SubscriptionController>(); 
     subscriptionController.Setup(s => s.HttpContext).Returns(httpContext.Object); 

     var result = subscriptionController.Object.SendEmail(subscriptionViewModel); 

     Assert.AreEqual(((ViewResult)result).ViewName, "Index"); 

    } 
} 

Tôi có một bộ điều khiển gọi là SubscriptionController. Ở đó, tôi có một Phương thức hành động được gọi là SendEmail. Tôi muốn có thể chạy Đăng ký/GửiEmail bằng phương pháp Thử nghiệm ở trên. Chế độ xem của tôi là biểu mẫu có các trường sau: Tên, Họ, Email, Nhận xét và hộp kiểm. Tôi cần phải giả lập biểu mẫu này và cũng giả lập trình điều khiển, yêu cầu và bối cảnh http của tôi. Tôi là một chút bối rối những gì để chế giễu và những gì để sử dụng như thật. Cảm ơn bạn đã làm rõ.

+0

Bạn có thể đăng lớp học (hoặc một phần liên quan của nó) mà bạn đang cố gắng giả lập không? –

Trả lời

6

Trả lời: bạn có thể giả lập bài đăng biểu mẫu bằng cách thiết lập các giá trị biểu mẫu trong Request.Form trực tiếp. Trước khi tôi chế nhạo HttpRequest, thiết lập các giá trị biểu mẫu và sau đó liên kết đối tượng httpRequest với đối tượng HttpContext. Cách tiếp cận này không hiệu quả.

Tôi đăng giải pháp dưới đây, chỉ cần so sánh tôi đã làm trước và bạn sẽ hiểu.

[TestMethod] 
public void TestSendSubscriptionEmail() 
{ 
    //HTTP CONTEXT SET UP 
    var httpContext = new Mock<HttpContextBase>();   

    var routeData = new RouteData(); 
    httpContext.Setup(c => c.Request.RequestContext.RouteData).Returns(routeData); 

    httpContext.Setup(c => c.Request.Form).Returns(delegate() 
    { 
     var nv = new NameValueCollection(); 
     nv.Add("FirstName", "John"); 
     nv.Add("LastName", "Smith"); 
     nv.Add("Email", "[email protected]"); 
     nv.Add("Comments", "Comments are here..."); 
     nv.Add("ReceiveUpdates", "true"); 
     return nv; 
    }); 

    httpContext.Setup(c => c.Request.Path).Returns("/Subscription/SendEmail"); 

    var subscriptionViewModel = new Mock<ISubscriptionViewModel>(); 

    subscriptionViewModel.Setup(h => h.HttpContext).Returns(httpContext.Object); 

    subscriptionViewModel.Setup(h => h.FirstName).Returns(httpContext.Object.Request.Form["FirstName"]); 
    subscriptionViewModel.Setup(h => h.LastName).Returns(httpContext.Object.Request.Form["LastName"]); 
    subscriptionViewModel.Setup(h => h.Email).Returns(httpContext.Object.Request.Form["Email"]); 
    subscriptionViewModel.Setup(h => h.Comments).Returns(httpContext.Object.Request.Form["Comments"]); 
    subscriptionViewModel.Setup(h => h.InvestmentUpdates).Returns(bool.Parse(httpContext.Object.Request.Form["ReceiveUpdates"])); 

    var subscriptionController = new SubscriptionController(subscriptionViewModel.Object); 

    var result = subscriptionController.SendEmail(subscriptionViewModel.Object); 

    Assert.AreEqual(((ViewResult)result).ViewName, "Index"); 

}