测试从ASP.NET MVC应用程序返回的HTTP标头

时间:2016-04-07 19:11:19

标签: asp.net-mvc unit-testing nunit rhino-mocks

出于安全原因,我使用MVC应用程序中的两个经典策略添加和删除了多个标头:

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
    HttpContext.Current.Response.Headers.Remove("X-AspNet-Version");
    HttpContext.Current.Response.Headers.Remove("Server");
    HttpContext.Current.Response.Headers.Remove("X-AspNetMvc-Version");
}

通过Web.Config:

<customHeaders>
    <remove name="X-Powered-By" />
    <add name="X-Frame-Options" value="DENY" />
</customHeaders>

目前我正在使用 NUnit RhinoMocks 配对进行测试,FWIW。

考虑到模拟HttpContext的困难,确保自定义标头在我回复的任何视图的http响应中是否存在或不存在的好方法?

1 个答案:

答案 0 :(得分:5)

验证此行为的正确方法是通过组件测试。原因很简单;您正在尝试确保安全问题,在UT中没有任何内容可确保您的组件将使用此行为。我可以为你提供几个选项(代码编织工具,添加公共方法等等)来测试它作为UT,但IMO这是集成测试的经典案例。

要对组件测试此行为,请执行以下步骤:

提升自我主机服务器(Self-Host ASP.NETOWIN to Self-Host ASP.NET

然后在调用方法并声明答案不包含标题:

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();  

Assert.IsFalse(myHttpWebResponse.Headers.ContainsKey("X-Frame-Options");
Assert.IsFalse(myHttpWebResponse.Headers.ContainsKey("Server");
Assert.IsFalse(myHttpWebResponse.Headers.ContainsKey("X-AspNetMvc-Version");
//todo: add logic which read the following parameters from the configuration
Assert.IsFalse(myHttpWebResponse.Headers.ContainsKey("X-AspNet-Version");
Assert.AreEquals("DENY", myHttpWebResponse.Headers["X-Frame-Options"]);