2011-03-09 59 views
3

我的代碼做這個我怎麼能嘲笑Request.Url.GetLeftPart(),所以我的單元測試通過

string domainUrl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); 
int result = string.Compare(domainUrl, "http://www.facebookmustdie.com"); 
// do something with the result... 

我怎麼能嘲笑這個,所以我的單元測試通過,我必須嘲笑整個HttpContext類?如果這是我怎麼會注入到這一點的代碼,這樣的「正確」的HttpContext當單元測試運行

+0

你可以嘲笑或使用存根,你必須決定你想要做什麼。 – 2012-10-17 20:39:54

回答

2

HttpContext單例不能輕易被模擬,並且在單元測試中也不能很好地運行,因爲它將您與IIS基礎結構聯繫在一起。

這是真的,痣可以做的工作太多,但真正的問題是重couplage與IIS。

您應該將相關的請求數據(您的案例中的url)傳遞給您的函數或類,以便能夠將您的邏輯從基礎結構中分離出來。這樣一來,你就可以將其從IIS分開,並在測試基礎架構上運行很容易。

0

基本上被使用,有兩種可能的情況:

  1. 使用TypeMock IsolatorMoles到模擬HttpContext
  2. 介紹的接口爲全HttpContext類或只是一個UrlHelper並通過實現該接口到你的類的類的實例。關鍵字:依賴注入(DI)
+0

的2第二部分是依賴注入。 2的第一部分是一個適配器。 – 2011-03-09 17:14:02

0

我不知道是什麼類型的項目,你寫的這個代碼,但如果它是一個MVC項目,我會建議重新編寫代碼時使用HttpContextBase而不是 - 如果可能的話。然後你可以創建一個存根或模擬這個併爲你的測試注入它。 Request.Url返回的System.Uri所以你必須創建這樣一個實例,並設置你的背景存根/模擬。

12

You don't need to mock it:

 var sb = new StringBuilder(); 
     TextWriter w = new StringWriter(sb); 
     var context = new HttpContext(new HttpRequest("", "http://www.example.com", ""), new HttpResponse(w)); 

     HttpContext.Current = context; 

     Console.WriteLine(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)); 
+1

這很好,我不知道你能做到這一點,我一定能夠在將來使用它,我沒有把這個標記爲答案的唯一原因是因爲我重新思考了我的設計,因此能夠改善它。 – Rob 2011-03-10 10:53:02

0

例以上:

namespace Tests 
{ 
    [TestClass()] 
    public class MyTests 
    { 
     [ClassInitialize()] 
     public static void Init(TestContext context) 
     { 
     // mock up HTTP request 
     var sb = new StringBuilder(); 
     TextWriter w = new StringWriter(sb); 
     var httpcontext = new HttpContext(new HttpRequest("", "http://www.example.com", ""), new HttpResponse(w)); 

     HttpContext.Current = httpcontext; 

     } 
     [TestMethod()] 
     public void webSerivceTest() 
     { 
     // the httpcontext will be already set for your tests :) 
     } 
    } 
}