2010-01-29 29 views
6

Trong ứng dụng Asp.net MVC của tôi, tôi có hai phương pháp trên một bộ điều khiển, một cho khi người dùng đầu tiên đến trên xem và sau đó một khi họ gửi biểu mẫu trên cho biết xem .mvccontrib kiểm tra helper và xác minh http bài tuyến đường và các thông số

public ActionResult Foo() {} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Foo(string id, Account accountToFoo) {} 

Trong hành động thứ hai, có một chất kết dính mô hình tùy chỉnh lắp ráp đối tượng tài khoản mà tôi đang hành động, mặc dù điều đó thực sự không quan trọng. Tất cả điều này hoạt động tốt trong thử nghiệm cục bộ trên một máy chủ.

Chúng tôi cố gắng khá tốt khi viết các bài kiểm tra đơn vị để kiểm tra tất cả các chế độ xem khác nhau của chúng tôi được định tuyến đúng cách, bao gồm cả những bài đăng HTTP POST. Để làm như vậy, chúng tôi đã sử dụng trình trợ giúp kiểm tra của mvccontrib.

Testing bị đã được siêu đơn giản

"~/account/foo/myusername". 
     Route(). 
     ShouldMapTo<AccountController>(c => c.Foo("myusername")); 

Câu hỏi của tôi là ở các tuyến đường POST thử nghiệm, làm thế nào để viết lambda mà tôi sẽ sử dụng để xác minh các bài đang nhận được giá trị chính xác, tương tự như kiểm tra GET trên ?

Đối với một POST, nó trông giống như sau:

"~/account/foo". 
     WithMethod(HttpVerbs.Post). 
     ShouldMapTo<AccountController>(a => something_something); 

Đó là phần something_something của lambda của tôi mà tôi đang gặp rắc rối với. Sử dụng các giá trị tùy ý không hoạt động ("a => a.Foo (0, Tài khoản mới()"). Làm cách nào để chỉ định các giá trị mong đợi như một phần của thử nghiệm?

EDIT Tôi đã hy vọng có một cái gì đó giống như cách Moq có lambdas cho báo cáo như foo.Setup (s => s.Foo (It.IsAny(), It.Is (i => i> 32)) và như vậy. Ngay cả tôi phải rõ ràng .. cung cấp các giá trị, đó là hoàn toàn khả thi - tôi chỉ dường như không thể grok cấu trúc mong muốn để vượt qua những giá trị rõ ràng

+0

Bạn đã bao giờ giải quyết vấn đề này chưa? – Paul

+0

Không, không bao giờ làm - và đã bị phân tâm với các phần khác của ứng dụng mới của tôi mà đơn vị kiểm tra các hành động POST cụ thể này đã giảm xuống bên lề đường. Vẫn muốn biết cách tốt nhất để tiếp cận điều này. – bakasan

Trả lời

15

Dưới đây là một ví dụ Giả sử bạn có hành động sau đây:

public AccountController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Foo(string id) 
    { 
     return View(); 
    } 
} 

Và con đường sau đây đã đăng ký:

RouteTable.Routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "home", action = "index", id = "" } 
); 

Bạn có thể kiểm tra nó như thế này:

var routeData = "~/account/foo".WithMethod(HttpVerbs.Post); 
routeData.Values["id"] = "123"; 
routeData.ShouldMapTo<AccountController>(c => c.Foo("123")); 

Một số tinh chỉnh có thể là cần thiết để bao gồm các Account số thứ hai mà bạn có.

+0

Rất kỳ lạ, kịch bản này không hiệu quả đối với tôi. Tôi có 2 hành động trên cùng một bộ điều khiển, một hành động được gắn nhãn cho HttpGet và một cho HttpPost. Tôi có thể bình luận phương thức HttpPost (cùng tên với HttpGet, nhưng với một chữ ký khác) và thử nghiệm của tôi vẫn sẽ chuyển qua ví dụ bạn đã cung cấp trong phần "Bạn có thể kiểm tra nó như thế này" ở trên. Đây là liên kết đến câu hỏi của tôi nếu bạn có bất kỳ ý tưởng nào: http: // stackoverflow.com/questions/4157161/issue-with-mvccontrib-testhelper-fluent-route-testing-và-specific-httpverbs –

2

Sử dụng cú pháp MvcContrib helper:

"~/account/foo".WithMethod(HttpVerbs.Post).ShouldMapTo<AccountController>(a => a.foo(null)); 

Bạn vượt qua null như Foo (string id, Tài khoản accountToFoo) phương pháp không bao giờ được thực hiện như một phần của thử nghiệm định tuyến.

Các vấn đề liên quan