2010-05-25 26 views
5

Tôi đang cố gắng sử dụng mã như sau trong các thử nghiệm đơn vị của tôi,Tôi làm cách nào để kiểm tra độ phân giải tuyến đường/hành động của URL bằng chuỗi truy vấn?

/* Test setup code */ 
_routes = RouteTable.Routes; 
MvcApplication.RegisterRoutes(_routes); //set up the routes as they would be in actual application 
/* test code */ 
Expression<Func<SearchController, ActionResult>> actionFunc; 
actionFunc = action => action.Results("x", 3, null); 
RouteTestingExtensions.Route(
    "~/Search/Results?searchText=x" 
).ShouldMapTo<SearchController>(actionFunc); 

Vấn đề là, đây là thất bại với "kết quả mong đợi bởi là kết quả? SearchText = x"

Có ai có một giải pháp mà sẽ cho phép tôi để kiểm tra rằng một URL (với chuỗi truy vấn) giải quyết để điều khiển, hành động và đối số chính xác?

FYI, tôi không có thiết lập tuyến đường rõ ràng trong Global.asax.cs, làm tuyến đường mặc định hoạt động cho ứng dụng thực tế - nó không hoạt động trong thử nghiệm này.

+0

Bất kỳ đề xuất nào đối với những người thử nghiệm khác làm cho thử nghiệm tuyến đường dễ dàng như thế này? – Graza

Trả lời

9

IMHO nó làm cho tinh thần để đơn vị kiểm tra chỉ đường tùy chỉnh. Kiểm tra tham số chuỗi truy vấn sẽ được dịch sang đối số hành động của trình điều khiển là không cần thiết và không thực sự mang lại bất kỳ giá trị nào cho ứng dụng của bạn. Công việc này được thực hiện bởi các chất kết dính mô hình mặc định và là đơn vị rộng rãi được thử nghiệm bởi Microsoft (tôi hy vọng).

Điều này đang được nói MVCContrib.TestHelper cho phép bạn kiểm tra các tuyến đường tùy chỉnh một cách thanh lịch. Giả sử ví dụ mà bạn đã thực hiện phân trang trong ứng dụng của bạn và xác định một lộ trình tùy chỉnh để có url khá cho SEO:

routes.MapRoute(
    "Custom", 
    "foo/{startPage}/{endPage}", 
    new 
    { 
     controller = "Search", 
     action = "Results", 
    } 
); 

và đây là bộ điều khiển đi kèm:

public class SearchController : Controller 
{ 
    public ActionResult Results(int startPage, int endPage) 
    { 
     return View(); 
    } 
} 

Tuyến đường này có thể được kiểm tra như thế này :

"~/foo/10/20".ShouldMapTo<SearchController>(c => c.Results(10, 20)); 

này một cách hiệu quả sẽ kiểm tra xem điều khiển mặc định là Search, hành động mặc định là Results và rằng cả hai 01 Các thông sốvà endPage sẽ được khởi tạo thành giá trị tương ứng của chúng từ tuyến đường.

+0

Điều này sẽ hoạt động & là những gì tôi đang làm, nhưng vấn đề là tôi muốn thử nghiệm một URL có chuỗi truy vấn (tức là "/ Controller/Action? Query") và TestHelper không xử lý chuỗi truy vấn. Tôi có thể thay đổi tìm kiếm để sử dụng đường dẫn thay vì truy vấn, nhưng điều đó sẽ liên quan đến JS phía máy khách để tạo URL cho yêu cầu - trong trường hợp này tôi không muốn JS, chỉ cần gửi biểu mẫu đơn giản GET. Bạn có thể đúng tuy nhiên, rằng nó chỉ là không có giá trị thử nghiệm. Dự án tôi đã làm việc khi tôi hỏi đó là lần đầu tiên tôi bước vào MVC, và tôi vẫn không chắc chắn các phần "ma thuật" nên được kiểm tra ở mức độ nào. – Graza

+0

Điều gì sẽ xảy ra nếu tuyến đường tùy chỉnh của tôi chỉ hoạt động với chuỗi truy vấn? (Bên cạnh tuyến đường của tôi, chữ ký hành động của bộ điều khiển của tôi có một tham số id được chuyển bởi chuỗi truy vấn - bây giờ làm thế nào tôi có thể kiểm tra tuyến đường tùy chỉnh đó?) – BornToCode

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