2010-11-25 110 views
1

我有一個方法,我已經在C#/ ASP.Net Web項目中添加了單元測試。該方法已被其他人修改,以包含對包裝HttpContext(添加一些會話狀態)的類的靜態方法的調用,但在測試期間,我沒有HttpContext,因此會引發空引用異常。任何想法如何解決這個問題?如果我可以幫忙的話,我不想對生產代碼做太多改動。被測單元測試一個包含HttpContext的靜態類的調用

方法:

public int MethodUnderTest() 
{ 
    ... 
    // Added line which breaks the tests 
    StaticClass.ClearSessionState(); 
} 

在StaticClass:

public void ClearSessionState() 
{ 
    HttpContext.Current.Session["VariableName"] = null; 
} 

這將引發NullReferenceException因爲HttpContext.Current測試過程中爲空。

回答

0

最後我可能只是刪除調用StaticClass.ClearSessionState(),但所有的答案感謝。有用的東西。

1

就使用HttpContext.Current而言的單元測試方法而言,您幾乎處於死路一條。正確的方法是修改此代碼使用構造器注入:

private readonly HttpContextBase _context; 
public Foo(HttpContextBase context) 
{ 
    _context = context; 
} 

public void ClearSessionState() 
{ 
    _context.Session["VariableName"] = null; 
} 

現在你可以在你的單元測試嘲笑這個HttpContextBase

1

在調用StaticClass.ClearSessionState()行之前,您可以使用模擬/存根對象設置HttpContext.Current。

1

你可以做你自己靜「注射液」的生產代碼如下所示:

public static class StaticClass { 
    public void ClearSession() { 
     TheContext["VariableName"] = null; 
    } 

    public static HttpContextBase TheContext{ 
     get { 
      if (_context == null) 
       _context = new HttpContextWrapper(HttpContext.Current); 
      return _context; } 
     set { _context = value; } 
    } 
} 

實際測試就成爲非常容易的,只需設置TheContext屬性存根實例的測試之前。例如,在這樣的Moq的存根可以建立一個行:

StaticClass.TheContext = new Mock<HttpContextBase>(){DefaultValue = DefaultValue.Mock}.Object; 
相關問題