2008-10-23 25 views
7

Tôi đã thử một lúc để viết một bài kiểm tra đơn vị cho một UserViewControl trong ASP.NET MVC. Tôi muốn nhận được mã trông giống như sau:Tôi có thể kiểm tra đơn vị MVC UserViewControl như thế nào?

[TestMethod] 
public void HaveControlToDisplayThings() 
{ 
    var listControl = new ControlUnderTest(); 
    var viewData = new ViewDataDictionary<IList<string>>(this.repo.GetMeSomeData()); 

    // Set up a ViewContext using Moq. 
    listControl.SetFakeViewContext(viewData); 
    listControl.ViewData = viewData; 
    listControl.RenderView(listControl.ViewContext); 

    // Never got this far, no idea if this will work :) 
    string s = listControl.ViewContext.HttpContext.Response.Output.ToString(); 
    Assert.AreNotEqual(0, s.Length); 
    foreach (var item in this.repo.GetMeSomeData()) 
    { 
     Assert.IsTrue(s.IndexOf(item) != -1); 
    } 
} 

Thật không may, cho dù tôi cố gắng gặp lỗi từ sâu bên trong RenderView. Điều này được gây ra (theo như tôi có thể nói) bởi đối tượng HttpContext.Current tĩnh là vô ích - tôi nhận được NullReferenceException s từ System.Web.UI.Page.SetIntrinsics.

tôi đã cố gắng sử dụng Phil Haack của HttpSimulator đó đã cho tôi một đối tượng HttpContext nhưng tôi thấy tôi cũng cần phải xác định một đối tượng giả HttpBrowserCapabilities để có được một chút nữa:

Subtext.TestLibrary.HttpSimulator simulator = new HttpSimulator(); 
simulator.SimulateRequest(); 
var browserMock = new Mock<HttpBrowserCapabilities>(); 
browserMock.Expect(b => b.PreferredRenderingMime).Returns("text/html"); 
browserMock.Expect(b => b.PreferredResponseEncoding).Returns("UTF-8"); 
browserMock.Expect(b => b.PreferredRequestEncoding).Returns("UTF-8"); 
HttpContext.Current.Request.Browser = browserMock.Object; 

Bây giờ tôi có được ngoại lệ về sở hữu truy cập vào đối tượng đó . Tôi chế nhạo càng nhiều càng tốt, nhưng dường như không nhanh đến đâu.

Có ai đã quản lý để thực hiện tác phẩm này không?

+0

Tôi đã từ bỏ đơn vị kiểm tra chế độ xem một thời gian dài trước đây. Hãy thử di chuyển bất kỳ logic kinh doanh bạn có vào bộ điều khiển và đơn vị kiểm tra những thay thế. Lượt xem nổi tiếng là phức tạp đối với thử nghiệm đơn vị. Có thể có một câu trả lời thực sự, nhưng tôi đã từ bỏ nó một lúc trước bởi vì quan điểm của chúng tôi phát triển quá nhanh. – CVertex

+0

Vâng, nói chung tôi không muốn kiểm tra quan điểm của mình nhưng khi tôi đang sử dụng Điều khiển người dùng, đây là một phần có thể sử dụng lại thường được sử dụng trên tất cả ứng dụng và không có mã điều khiển để nói. Tôi muốn kiểm tra xem nó có thể được khởi tạo và hiển thị hay không và chứa đựng đúng nội dung. –

+0

Theo như tôi có thể hiểu bạn đang thực sự thử nghiệm repo.GetMeSomeData() mà không phụ thuộc vào xem hoặc điều khiển người dùng một chút. Bạn có thể kiểm tra xem repo.GetMeSomeData() cung cấp cho bạn những gì bạn muốn và không gọi điều khiển không? – Graviton

Trả lời

3

Thật không may, khung nhìn ASP.NET sử dụng VirtualPathProvider trong môi trường lưu trữ ASP.NET. Để làm cho vấn đề tồi tệ hơn, tôi đã truy tìm một số mã khác bằng cách sử dụng Reflector và thấy rằng có những phụ thuộc khác đối với một số tham chiếu hardcode đối với các tiện ích VirtualPath. Tôi hy vọng họ sửa lỗi này trong bản phát hành để chúng tôi có thể thực sự kiểm tra Chế độ xem của mình và cách chúng được hiển thị.

+0

Chấp nhận điều này như là câu trả lời vì có vẻ như đó là bản chất: Không, không có cách nào để ** kiểm tra đơn vị ** kết quả của việc hiển thị lượt xem. Sử dụng selen, Watin hoặc tương đương là một lựa chọn tốt, nhưng nó không phải là những gì tôi thực sự muốn làm - kiểm tra trình duyệt của kiểm soát/xem đầu ra. –

2

Một tùy chọn là chạy thử nghiệm đơn vị bên trong trình duyệt. Tôi đã thành công với Selenium cho những trường hợp như vậy.

2

Chúng tôi đã từ bỏ các lượt xem thử nghiệm đơn vị và hiện đang sử dụng các kiểm tra trình duyệt WatiN như một phần của bản dựng của chúng tôi.

Chúng tôi cũng sử dụng Phân tích rộng giải pháp Resharper để kiểm tra xem có lỗi trình biên dịch hay không. Không hoàn hảo, nhưng nó có kết quả rất giống nhau. Nhược điểm - WatiN kiểm tra chậm.

1

Đây là những giá trị cần phải được đặt trong đối tượng HttpBrowserCapabilities cho trang web asp.net để chạy, tôi sẽ cố gắng đảm bảo chúng được đặt và xem liệu có khắc phục được sự cố của bạn hay không, tôi không chắc chắn sẽ nhưng hey nó có giá trị một shot phải không?

  • Browser (aka tên)
  • useragent (thông qua trong yêu cầu)
  • bảng (true/false)
  • phiên bản (phiên bản của trình duyệt ví dụ 1.0)
  • w3cdomversion (ví dụ 1.0)
  • cookie (true/false)
  • ecmascriptversion (ví dụ 1,0)

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn, tôi sẽ thử lần sau khi tôi làm việc với mã đó. –

1

Tôi cũng khuyên bạn nên selenium để kiểm tra giao diện người dùng. Có một chút khá trong một ứng dụng MVC tiêu chuẩn có thể được kiểm tra đơn vị, nhưng các thành phần cấp UI luôn có vẻ phù hợp hơn cho thử nghiệm trong trình duyệt như Selenium. Bạn có thể tích hợp thử nghiệm Selenium với thử nghiệm đơn vị của mình bằng cách sử dụng cruisecontrol.net.

Dưới đây là guide để tích hợp Selenium với CC.Net của bạn.

1

Sử dụng TypeMock để loại bỏ các phụ thuộc. Tôi đã viết one blog post về cách loại bỏ các phụ thuộc Yêu cầu và Phản hồi trong lớp Trình điều khiển. Có lẽ nó rất hữu ích.

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