2011-09-24 6 views
6

Tôi đang chạy các kiểm tra đơn vị trên mã sử dụng VirtualParthUtility.GetAbsolute, nhưng có vấn đề nhạo báng bối cảnh cho việc này hoạt động.Làm thế nào để mô phỏng bối cảnh trong khi mã thử nghiệm đơn vị sử dụng phương thức VirtualPathUtility.GetAbsolute

tôi đã thiết lập một bối cảnh giả với Moq như sau

private Mock<HttpContextBase> MakeMockHttpContext(string url) // url = "~/" 
    { 
     var mockHttpContext = new Mock<HttpContextBase>(); 

     // Mock the request 
     var mockRequest = new Mock<HttpRequestBase>(); 
     mockRequest.Setup(x => x.ApplicationPath).Returns("/"); 
     mockRequest.Setup(x => x.Path).Returns("/"); 
     mockRequest.Setup(x => x.PathInfo).Returns(string.Empty); 
     mockRequest.Setup(x => x.AppRelativeCurrentExecutionFilePath).Returns(url); 

     mockHttpContext.Setup(x => x.Request).Returns(mockRequest.Object); 

     // Mock the response 
     var mockResponse = new Mock<HttpResponseBase>(); 
     mockResponse.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())).Returns((string s) => s); 

     mockHttpContext.Setup(x => x.Response).Returns(mockResponse.Object); 

     return mockHttpContext; 
    } 

Và kèm theo này để một MVC Controller

_myController.ControllerContext = new ControllerContext(MakeMockHttpContext("~/").Object, new RouteData(), _slideSelectorController); 

Mã chạy trong khi thử nghiệm hits dòng:

venue.StyleSheetUrl = VirtualPathUtility.ToAbsolute(venue.StyleSheetUrl); // input like "~/styles/screen.css" 

Mỗi lần chạy, nó sẽ chuyển thành System.Web.VirtualPathUtility, với sự cố là "VirtualP arthString" để được trả lại luôn ném một ngoại lệ:

public static string ToAbsolute(string virtualPath) 
{ 
    return VirtualPath.CreateNonRelative(virtualPath).VirtualPathString; 
} 

Lý do cho sự ngoại lệ là dễ dàng nhận thấy trong System.Web.VirtualPathString:

public string VirtualPathString 
{ 
    get 
    { 
    if (this._virtualPath == null) 
    { 
     if (HttpRuntime.AppDomainAppVirtualPathObject == null) 
     { 
     throw new HttpException(System.Web.SR.GetString("VirtualPath_CantMakeAppAbsolute", new object[] { this._appRelativeVirtualPath })); 
     } 
     if (this._appRelativeVirtualPath.Length == 1) 
     { 
     this._virtualPath = HttpRuntime.AppDomainAppVirtualPath; 
     } 
     else 
     { 
     this._virtualPath = HttpRuntime.AppDomainAppVirtualPathString + this._appRelativeVirtualPath.Substring(2); 
     } 
    } 
    return this._virtualPath; 
    } 
} 

Qua cửa sổ Watch Window tôi có thể thấy rằng _virtualPath và HttpRuntime.AppDomainAppVirtualPathString là cả hai null, do đó nó ném một ngoại lệ.

Nếu _virtualPath được đặt, ngoại lệ sẽ không xảy ra. Nhưng sau khi phương thức VirtualPath.Create đã tạo một đối tượng VirtualPath mới, nó không thiết lập thuộc tính _virtualPath trước khi nó được trả về. Trích xuất từ ​​phương pháp Tạo đến thời điểm này là:

VirtualPath path = new VirtualPath(); 
    if (UrlPath.IsAppRelativePath(virtualPath)) 
    { 
    virtualPath = UrlPath.ReduceVirtualPath(virtualPath); 
    if (virtualPath[0] == '~') 
    { 
     if ((options & VirtualPathOptions.AllowAppRelativePath) == 0) 
     { 
     throw new ArgumentException(System.Web.SR.GetString("VirtualPath_AllowAppRelativePath", new object[] { virtualPath })); 
     } 
     path._appRelativeVirtualPath = virtualPath; 
     return path; 

Vì vậy, nếu có ai có thể đề xuất cách làm bài kiểm tra đơn vị này, sẽ rất hữu ích!

Cảm ơn,

Steve

+0

Đọc xung quanh, có lẽ tôi cần sử dụng Khung cách ly để giả lập phương thức tĩnh HttpRuntime.AppDomainAppVirtualPath? – Appetere

Trả lời

5

Tôi chỉ sẽ tạo ra một giao diện wrapper. Một cái gì đó như:

public interface IPathUtilities 
{ 
    string ToAbsolute(string virtualPath); 
} 

Bạn có thể đưa điều đó vào bộ điều khiển của mình. Tại thời điểm thử nghiệm, sử dụng một sơ khai. Khi chạy, bạn sẽ có một lớp thực hiện IPathUtilities và gọi VirtualPathUtility.ToAbsolute().

+0

Cảm ơn bạn đã đề xuất. Nice giải pháp thanh lịch. – Appetere

+0

Nếu bạn thích câu trả lời này, vui lòng đánh dấu nó là giải pháp được chấp nhận. Cảm ơn! – PatrickSteele