2010-07-13 76 views
13

我使用C#4.0,我需要單元測試服務。服務內部的函數返回一個類似於我稱爲expected的變量的路徑,這是我期望返回的路徑。但是當我運行這個測試時,我得到了HttpContext.Current爲NULL的錯誤。我能做些什麼來解決這個問題,以便測試可以運行?在單元測試中使用httpcontext

[TestMethod] 
public void GetPathTest() 
{ 
    var expected = System.IO.Path.GetFullPath(HttpContext.Current.Server.MapPath("~/Certificates/")); 
    var path = _mockService.Setup(o => o.GetPath()).Returns(expected); 
} 

回答

17

此刻,我能找不到我之前使用的HttpContext的完整包裝器,但目前我們只是爲空請求創建一個上下文並從那裏開始,如下所示:

SimpleWorkerRequest request = new SimpleWorkerRequest("","","", null, new StringWriter()); 
HttpContext context = new HttpContext(request); 

然後在單元測試中初始化或單元測試本身(在創建之前的預期),您可以設置當前HttpContext如下:

HttpContext.Current = context; 

然後簡單充實的假背景和可能的假SessionState的,等按要求。

(編輯:這是所有在VS2008,框架3.5的方式)。

+0

感謝您的迴應!這樣做了,儘管我通過添加正確的路徑和地址來修改了simpleworkerrequest。 – Rob 2010-07-14 06:19:28

2

你可以嘗試尋找用於ASP.Net單元測試所創建的屬性,如

[HostType("ASP.NET")] 

link to MSDN具有相當好的寫了關於它的

1

我發佈此參考。這不是一個簡單的解決方案,以及關於鴨打字談判(如果它叫起來..):

http://haacked.com/archive/2007/08/19/why-duck-typing-matters-to-c-developers.aspx

http://haacked.com/archive/2007/09/09/ihttpcontext-and-other-interfaces-for-your-duck-typing-benefit.aspx

這是相關的,值得一讀;因爲沒有IHttpContext,所以不可能創建一個測試環境實現 - 直到你考慮在這裏使用Duck Typing庫。雖然這不是直接的答案。

希望有所幫助。

2

你可以用以下裝飾你的測試方法屬性:

[TestMethod] 
[HostType("ASP.NET")] 
[UrlToTest("http://localhost:xxxx/")] 
[AspNetDevelopmentServerHost("$(SolutionDir)\\xxx\\", "/")] 
public void TestMethod() 
{ 
    ... 
} 

然後添加一個Default.aspx文件到您的單元測試凸出。

在測試方法內部,您可以輕鬆訪問HttpContext。 如果你想調試,你可以使用一些痕跡或中斷調試執行該指令System.Diagnostics.Debugger.Break()

public void TestMethod() 
{ 
    System.Diagnostics.Debugger.Break(); 

    ... 
} 

,然後安裝調試的過程中,通過MSDN解釋: https://msdn.microsoft.com/en-us/library/vstudio/c6wf8e4z(v=vs.100).aspx