【问题标题】:Unit Testing a class with a call to a Static class wrapping an HttpContext通过调用包装 HttpContext 的静态类对类进行单元测试
【发布时间】:2010-11-25 09:33:52
【问题描述】:

我有一个方法,我在 C#/ASP.Net Web 项目中添加了单元测试。该方法已被其他人修改,包括对包装 HttpContext 的类上的静态方法的调用(以添加一些会话状态),但在测试期间我没有 HttpContext,因此这会引发空引用异常。任何想法如何解决这个问题?如果可以的话,我不想对生产代码进行太多更改。

待测方法:

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

在静态类中:

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

这会引发NullReferenceException,因为HttpContext.Current 在测试期间为空。

【问题讨论】:

    标签: c# unit-testing static-methods httpcontext


    【解决方案1】:

    就使用HttpContext.Current 的单元测试方法而言,您几乎处于死胡同。正确的方法是修改此代码以使用构造函数注入:

    private readonly HttpContextBase _context;
    public Foo(HttpContextBase context)
    {
        _context = context;
    }
    
    public void ClearSessionState()
    {
        _context.Session["VariableName"] = null;
    }
    

    现在您可以在单元测试中模拟这个HttpContextBase

    【讨论】:

      【解决方案2】:

      您可以在调用 StaticClass.ClearSessionState() 行之前使用模拟/存根对象设置 HttpContext.Current。

      【讨论】:

        【解决方案3】:

        您可以像这样在生产代码中进行自己的静态“注入”:

        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;
        

        【讨论】:

          【解决方案4】:

          最后我可以删除对StaticClass.ClearSessionState() 的调用,但感谢所有答案。有用的东西。

          【讨论】:

            猜你喜欢
            • 2016-06-20
            • 2017-02-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多