2011-09-24 21 views
6

VirtualParthUtility.GetAbsolute kullanan kodda birim testleri çalıştırıyorum, ancak bunun çalışması için bağlamla ilgili sorun yaşıyorum.VirtualPathUtility.GetAbsolute yöntemini kullanarak birim sınama kodu nasıl yapılır?

MVC Denetleyicisi

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

test sırasında çalışan kod için

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; 
    } 

şöyle MOQ ile sahte bir bağlam kurmak Ve bu ekli ettik çizgi vurur:

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

Her seferinde bu, System.Web.VirtualPathUtility içine girerek "VirtualP" sorunu arthString" her zaman döndürülecek bir istisna atar:

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

istisna sebebi System.Web.VirtualPathString görmek kolaydır:

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; 
    } 
} 

İzle Pencere arkası O _virtualPath görebilir ve HttpRuntime.AppDomainAppVirtualPathString her ikisi de boştur, dolayısıyla bir istisna atar.

_virtualPath ayarlanmışsa, istisna olmaz. Ancak, VirtualPath.Create yöntemi yeni bir VirtualPath nesnesi oluşturduktan sonra, _virtualPath özelliğini döndürülmeden önce ayarlamaz. Bu noktaya kadar Oluştur yöntemin özüdür:

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; 

herkes bu birim test çalışma almak için nasıl önerebilir Yani eğer, bu çok yardımcı olacak!

sayesinde

Steve

+0

Çevrede okuma, belki HttpRuntime.AppDomainAppVirtualPath statik yöntemini alay için bir yalıtım Framework kullanmanız gerekir? – Appetere

cevap

5

Ben sadece bir sarıcı arayüzü yaratacak. Şunlar gibi:

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

Kumandanıza enjekte edebilirsiniz. Test zamanında bir saplama kullanın. Çalışma zamanında, IPathUtilities uygulayan bir sınıfınız olacak ve VirtualPathUtility.ToAbsolute() numaralarını arayacaksınız.

+0

Öneriniz için teşekkürler. Güzel zarif bir çözüm. – Appetere

+0

Bu cevabı beğendiyseniz, lütfen kabul edilen çözüm olarak işaretleyin. Teşekkürler! – PatrickSteele

İlgili konular