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
Đọ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