2011-09-24 7 views
6

का उपयोग कर यूनिट परीक्षण कोड के दौरान संदर्भ का नकल कैसे करें I वर्चुअल पार्थ यूटिलिटी.गेटएब्सोल्यूट का उपयोग करने वाले कोड पर यूनिट परीक्षण चला रहा हूं, लेकिन इसके लिए संदर्भ के लिए संदर्भ का मज़ाक उड़ा रहा है।VirtualPathUtility.GetAbsolute विधि

मैं के रूप में

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

इस प्रकार Moq के साथ एक नकली संदर्भ सेट कर लेते हैं और एक MVC नियंत्रक

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

कोड है कि परीक्षण के दौरान चलाता को यह संलग्न लाइन हिट:

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

हर बार यह चलता है, यह System.Web.VirtualPathUtility में कदम करता है, समस्या के साथ "वर्चुअल पी arthString "हमेशा वापस करने के लिए एक अपवाद फेंकता है:

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

अपवाद के लिए कारण 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; 
    } 
} 

मुझे लगता है कि _virtualPath देख सकते हैं और HttpRuntime.AppDomainAppVirtualPathString दोनों शून्य हैं, इसलिए यह एक अपवाद फेंकता है।

यदि _virtualPath सेट किया गया था, तो अपवाद नहीं होगा। लेकिन वर्चुअलपाथ के बाद। क्रेट विधि ने एक नया वर्चुअलपाथ ऑब्जेक्ट बनाया है, यह वापस आने से पहले _virtualPath प्रॉपर्टी सेट नहीं करता है। इस बिंदु तक बनाएं विधि से एक उद्धरण है:

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; 

तो अगर किसी को भी यह कैसे इकाई परीक्षण काम कर पाने के लिए कर सकते हैं सुझाव है कि बहुत उपयोगी हो जाएगा!

धन्यवाद,

स्टीव

+0

चारों ओर पढ़ना, शायद मुझे स्थिर विधि HttpRuntime.AppDomainAppVirtualPath नकल करने के लिए एक अलगाव फ्रेमवर्क का उपयोग करने की आवश्यकता है? – Appetere

उत्तर

5

मैं सिर्फ एक आवरण इंटरफ़ेस बनाने जाएगा। कुछ ऐसा:

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

आप इसे अपने नियंत्रक में इंजेक्ट कर सकते हैं। परीक्षण समय पर, एक स्टब का उपयोग करें। रनटाइम पर, आपके पास एक कक्षा होगी जो IPathUtilities लागू करती है और VirtualPathUtility.ToAbsolute() पर कॉल करती है।

+0

सुझाव के लिए धन्यवाद। अच्छा सुरुचिपूर्ण समाधान। – Appetere

+0

यदि आपको यह उत्तर पसंद है, तो कृपया इसे स्वीकृत समाधान के रूप में चिह्नित करें। धन्यवाद! – PatrickSteele