2010-11-25 59 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; 
相关问题