单元测试ASP.NET通用处理程序而不使用HttpWebRequest

时间:2012-09-24 06:56:24

标签: c# asp.net unit-testing generic-handler

我需要为我的ASP.NET通用处理程序创建单元测试用例。我的处理程序代码如下:

    public class MyHandler : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello World");
            var data = context.Request.InputStream;
            //Here logic read the context.Request.InputStream
            //All the data will be posted to this Stream
            //Calling of business logic layer Methods
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

现在,我需要为此Handler创建Unit测试用例。我尝试过以下方法来进行单元测试用例。

  • 为此句柄设置HttpWebRequest并将所有数据写入请求流。我不想继续这样做,因为我们有单独的工具使HttpWebRequest测试所有处理程序
  • 为Business方法创建单元测试用例,但在此我无法检查以处理程序级别编写的逻辑。

我曾尝试模拟HttpContext,但它不允许模拟这个(是否可以模拟HttpContent?)。我试过了 this方式,但这需要修改我的处理程序,但我没有这样做的规定。

最后我的问题是,是否还有其他单元测试处理程序的方法?

先谢谢。

1 个答案:

答案 0 :(得分:0)

模拟上下文可以做的是创建一个使用HttpContextBase的附加方法,只是转发来自接口方法的调用。可以使用HttpContextWrapper调用HttpContextBase,这样可以模拟上下文

public void ProcessRequest(HttpContext context)
    {
       ProcessRequestBase(new HttpContextWrapper(context));
    }
    public void ProcessRequestBase(HttpContextBase ctx)
    {

    }

可以通过点击ProcessRequestBase方法来测试。我们必须假设ProcessRequestBase按预期工作,但这很难避免。 然后你可以使用像这样的调用来测试它

HttpContextBase mock = new Mock<HttpContextBase>(); //or whatever syntax your mock framework uses
handler.ProcessRequest(mock.Object);