Unit Test : 在單元測試中使用HttpContext

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 類別




 


 

  • 如果您覺得這篇文章有幫助,請您幫忙推薦一下或按上方的""給予支持,非常感激
  • 歡迎轉載,但請註明出處
  • 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝