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?
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
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. –
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