Unit Test : 在單元測試中使用HttpContext
最近在寫專案的單元測試時,碰到一個問題是測試的Method裡面有用到HttpContext,
導致直接執行測試的時候,會回傳錯誤訊息 "System.NullReferenceException: 並未將物件參考設定為物件的執行個體.",
原因是因為HttpContext是null,
研究了半天,讓我找到一個方法可以在執行單元測試時,自己建立一個HttpContext,
就可以解決問題囉,
作法如下,
我建立了一個Class
public class Utility
{
public static void CreateHttpContext(string absolutePath, string physicalPath, string host, string page, string queryString)
{
TextWriter tw = new StringWriter();
HttpWorkerRequest wr = new MyWorkerRequest
(absolutePath, physicalPath, page, queryString, tw, host);
HttpContext.Current = new HttpContext(wr);
}
public class MyWorkerRequest : SimpleWorkerRequest
{
private string localAdd = string.Empty;
public MyWorkerRequest(string absolutePath, string physicalPath, string page, string query, TextWriter output, string address)
: base(absolutePath, physicalPath, page, query, output)
{
this.localAdd = address;
}
public override string GetLocalAddress()
{
return this.localAdd;
}
public override string MapPath(string virtualPath)
{
return Path.Combine(this.GetAppPath(), virtualPath);
}
}
}
進行單元測試時使用方法如下
/// <summary>
///A test for GetServerName
///</summary>
[TestMethod()]
[DeploymentItem("Test.dll")]
public void GetServerNameTest()
{
Utility.CreateHttpContext("/", @"C:\inetpub\wwwroot\DemoSite", "test.com.tw", "default.aspx", "");
string expected = "test.com.tw";
string actual;
actual = Test_Accessor.GetServerName();
Assert.AreEqual(expected, actual);
}
注意要引用System.Web.Hosting 命名空間。
利用這方法可以解決大部分使用HttpCotext的問題,
為什麼說大部分呢,
因為如果呼叫了HttpContext.Current.Server.MapPath方法,
是會回傳Exception的,當呼叫此方法時,
會去讀取HttpRuntime.AppDomainAppPath 屬性,
但HttpRuntime 不允許修改,暫時還沒有找到解法,
系望大家可以提供一下囉
參考資料
haacked.com/archive/2005/06/11/Simulating_HttpContext.aspx
www.global-webnet.net/BlogEngine/post/2008/09/22/TypeMock-Unit-test-for-ASPNET-class-utilities.aspx
www.koders.com/csharp/fidA9D8CFB7C3E5AF5B3FD318E1A6F05B9F92F5ECB2.aspx
HttpWorkerRequest 類別
- 如果您覺得這篇文章有幫助,請您幫忙推薦一下或按上方的"讚"給予支持,非常感激
- 歡迎轉載,但請註明出處
- 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝