none
想模擬HttpContext RRS feed

  • 問題

  • 前輩好,

    小弟想寫一些測試案例來測試API是否都能正常運作,

    但模擬的HttpContext,API都取不到queryString,讀出來的queryString都為空白,不知道是哪裡有問題

    以下是單元測試的程式碼:

    [TestMethod] public void ProcessRequest_StateUnderTest_ExpectedBehavior() { //因為要打的queryString很長,所以放在檔案內 var testDirPath = "C:/tmp/Api/DeleteRepNo_Test1.txt"; //讀出 var data = "data=" + File.ReadAllText(testDirPath, System.Text.Encoding.Default); // Arrange var unitUnderTest = CreateDeleteRepNoHandler(); //想打http://localhost/DeleteRepNo.ashx這支api // 帶的queryString為data var context = new HttpContext(new HttpRequest("DeleteRepNoHandler", "http://localhost/DeleteRepNo.ashx?", data), new HttpResponse(new StringWriter())); //長度會超過2k,所以設為Post context.Request.RequestType = "Post";

          context.RequestFormString(data); // Act unitUnderTest.ProcessRequest(context); // Assert Assert.Fail(); }

            public static string RequestFormString(this HttpContext Context, string QueryName)
            {
                return Context.Request.Form[QueryName] != null ? Context.Request.Form[QueryName].Trim().Replace(StringFormatException.Mode.CrossSiteScripting) : string.Empty;
            }

    API內,接收端的程式碼

       public void ProcessRequest(HttpContext context)
       {
             string data = string.Empty;
    
             if (context.Request.RequestType.ToUpper() == "GET") 
                data = context.RequestQueryString("data");
             else if (context.Request.RequestType.ToUpper() == "POST") 
                 data = context.RequestFormString("data");
    
              data = data.Trim();
        }

    但data怎麼接都是空白。

    但用context.Request.QueryString.GetValues("data")

    裡面是有抓到傳送的參數,也想搞懂這邊的邏輯..

    希望前輩能解惑,謝謝前輩

    2018年9月19日 上午 03:24

解答

所有回覆

  • 你的httpRequest怎麼這樣寫....

    參考這篇的寫法

    https://dotblogs.com.tw/joysdw12/archive/2012/12/04/85380.aspx

    然後.ashx的部分

    我怎不記得是這樣取值....

    應該是

    context.Request.QueryString["data"]

    • 已標示為解答 HumorA 2018年9月20日 上午 02:46
    2018年9月19日 上午 08:51
  • Humura前輩好

    一開始是嘗試照這篇的去修改,

    C#在非Web專案模擬HttpContext進行單元測試

    因為不懂所以被我改成四不像了。

    剛下班,明天一早會立刻嘗試用前輩的方法試試。


    2018年9月19日 下午 03:14
  • Humura前輩,可以了,非常感謝

    我測試程式的寫法:

    [TestMethod] public void ProcessRequest_StateUnderTest_ExpectedBehavior() { string targetUrl = "http://192.168.2.155/IMAPIForOnRich/DeleteRepNoHandler.ashx"; var testDirPath = "C:/tmp/Api/DeleteRepNo_Test1.txt"; var parame = "data=" + File.ReadAllText(testDirPath, System.Text.Encoding.Default); byte[] postData = Encoding.UTF8.GetBytes(parame); HttpWebRequest request = HttpWebRequest.Create(targetUrl) as HttpWebRequest; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.Timeout = 30000; request.ContentLength = postData.Length; // 寫入 Post Body Message 資料流 using (Stream st = request.GetRequestStream()) { st.Write(postData, 0, postData.Length); } string result = ""; // 取得回應資料 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { using (StreamReader sr = new StreamReader(response.GetResponseStream())) { result = sr.ReadToEnd(); } } var expected = "{\"Tec\":{\"IMSystem\":{\"Code\":\"0\",\"Message\":\"\"}}}"; var actual = result;

    //把測試程式改變的值恢復

    Recover(); Assert.AreEqual(expected, actual); }

    這支測試程式會改變DB資料的狀態,

    所以還有一個把資料復原的函式,但這邊沒寫上去。

    謝謝前輩

    2018年9月20日 上午 02:46