2011-09-24 25 views
6

VirtualParthUtility.GetAbsoluteを使用するコードで単体テストを実行していますが、これが動作するにはコンテキストを戸惑いにしています。VirtualPathUtility.GetAbsoluteメソッドを使用してユニットテストコードでコンテキストをモックする方法

は、私はMVCコントローラ

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

テスト中に実行されるコードに

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

を次のように部品番号でモックコンテキストを設定し、これを添付しました行を打つ:

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

これが実行されるたびに、System.Web.VirtualPathUtilityに進み、「VirtualP常に返される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は両方ともnullなので、例外をスローします。

_virtualPathが設定されている場合、例外は発生しません。 VirtualPath.Createメソッドが新しいVirtualPathオブジェクトを作成した後、_virtualPathプロパティが返される前に設定されません。これまでのCreateメソッドからの抽出物である:

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

関連する問題