2012-05-07 2 views
6

Tôi muốn xác nhận rằng lớp "HomeController" của tôi đang được chọn bởi tuyến đường mà tôi đã tạo. Vì vậy, tôi có một thử nghiệm như thế này:Đơn vị kiểm tra MVC với ASP.NET Dev Server

[TestMethod] 
    [UrlToTest("http://localhost:14478/home")] 
    [HostType("ASP.NET")] 
    [AspNetDevelopmentServerHost("$(SolutionDir)\\MvcBuildApp")] 
    public void MyTest() 
    { 
     System.Diagnostics.Debugger.Break(); 

     RouteCollection routes = new RouteCollection(); 
     MvcApplication.RegisterRoutes(routes); 
     MvcApplication.RegisterGlobalFilters(GlobalFilters.Filters); 
     //This fetches DefaultControllerFactory (for now, anyway...) 
     var factory = ControllerBuilder.Current.GetControllerFactory(); 
     //mock a context... 
     var httpContext = CreateHttpContext("http://localhost:14478/home", "GET"); 
     RouteData route = routes.GetRouteData(httpContext); 

     var ctrlInstance = factory.CreateController(new RequestContext(httpContext, route), (string)route.Values["controller"]); 

     //ASSERT the instance is of type "HomeController" 
     //... 
    } 

Nó thất bại, nói rằng 'http://localhost:14478/home' completed successfully without running the test.

tôi nhận thấy rằng trong cửa sổ đầu ra VS, đó cũng là thông điệp này No connection could be made because the target machine actively refused it 127.0.0.1:14478. Tôi cho rằng Cassini không được hoạt động. Vì vậy, tôi đã chọn để khởi chạy các trang web đang được thử nghiệm (ctrl + F5) trước khi tung ra các bài kiểm tra đơn vị. Sau đó, nó đã thay đổi đầu ra VS thành điều này:

WebTestAdapter.ConnectToHostAdapter: exception exception occured. Microsoft.VisualStudio.TestTools.HostAdapters.AbortTestExecutionException: Lỗi trong ứng dụng. tại Microsoft.VisualStudio.TestTools.HostAdapters.WebTestAdapter.ConnectToHostAdapter()

Để cố gắng giải quyết điều này, tôi đã làm theo lời khuyên của những bài viết này:

... nhưng tôi vẫn gặp lỗi bất kể tôi làm gì. Gợi ý?

UPDATE/Làm rõ
Câu hỏi này là không về việc kiểm tra các tuyến đường MVC. Mục đích của câu hỏi này là để khám phá làm thế nào để làm cho ASP.NET MVC đúng cách khởi tạo để cho phép nhiều hơn "chiều sâu" thử nghiệm tự động. Tôi đã chọn một kịch bản "thử nghiệm tuyến đường", chống lại DefaultControllerFactory, chỉ đơn thuần là một ví dụ. Trong ví dụ này, DefaultControllerFactory không hoạt động đúng trừ khi ASP.NET MVC được khởi tạo đúng cách.

Trả lời

0

Bạn có thể quan tâm trong việc rà soát kiểm tra khung Steve Sandersons MVC.Nếu bạn tải về mã nguồn, bạn sẽ có một ví dụ tuyệt vời về cách khởi tạo framwork MVC:

http://blog.codeville.net/2009/06/11/integration-testing-your-aspnet-mvc-application/

+0

Cách tiếp cận của Steven, được thể hiện trong liên kết mà bạn cung cấp, hoàn toàn tuyệt vời. Tôi khó có thể hy vọng cho bất cứ điều gì tốt hơn. Nó không trả lời câu hỏi của tôi về cách tôi có thể sử dụng các chú thích AspNetDevelopmentServerHost và HostType, nhưng nó làm một cái gì đó tương đương hoặc tốt hơn - theo như tôi đang quan tâm. –

1

Đây là một yêu cầu chung khi thử nghiệm các ứng dụng MVC, và may mắn bạn, có một khuôn khổ mà sẽ đơn giản hóa cuộc sống của bạn khi kiểm tra MVC controllers:

Các công cụ là:

http://mvccontrib.codeplex.com/

Và làm ví dụ, bạn có thể tạo các thử nghiệm chỉ với một dòng:

"~/".ShouldMapTo<HomeController>(controller => controller.Index()); 

Tham chiếu:

http://geekswithblogs.net/thomasweller/archive/2009/11/02/unit-testing-asp.net-mvc-routes.aspx

http://www.arrangeactassert.com/how-to-unit-test-asp-net-mvc-controllers/

+0

Tôi đã cập nhật câu hỏi của tôi để làm rõ rằng tôi không thực sự yêu cầu về kiểm tra tuyến đường. Bạn sẽ nhận thấy rằng thử nghiệm ví dụ của tôi sử dụng DefaultControllerFactory và có một nhận xét về việc thay thế nhà máy đó. Một khi nhà máy được thay thế, MVCContrib TestHelper mà bạn tham chiếu sẽ không còn có lợi cho tôi nữa. –