2017-10-13 55 views
1

我的應用程序中有一個CustomHttp模塊,用於刪除不需要的響應頭,如下所示。單元測試HttpModule中的事件

public class RemoveServerHeadersModule : IHttpModule 
     { 
      public void Init(HttpApplication context) 
      { 
       context.PreSendRequestHeaders += OnPreSendRequestHeaders; 
      } 

      public void Dispose() { } 

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

我需要爲此編寫單元測試。

試過幾個像下面但無法做到這一點,出現錯誤。

HttpRequest httpRequest = new HttpRequest("", "", ""); 
StringWriter stringWriter = new StringWriter(); 
HttpResponse httpResponse = new HttpResponse(stringWriter); 
HttpContext httpContextMock = new HttpContext(httpRequest, httpResponse); 

var application = new Mock<HttpApplication>(); 
application.Setup(ct => ct.Context).Returns(httpContextMock); 

var module = new RemoveServerHeadersModule(); 
HttpApplication httpApplication = new HttpApplication(); 
module.Init(httpApplication); 
module.OnPreSendRequestHeaders(httpApplication, EventArgs.Empty); 

嘗試在HttpApplication中設置上下文時出錯。 能不能請您幫我出

回答

0

guidance微軟,你不應該使用OnPreSendRequestHeaders事件

您可以使用PreSendRequestHeaders和PreSendRequestContext事件 與本地IIS模塊,但不使用它們管理模塊 實現IHttpModule。設置這些屬性可能會導致與異步請求相關的問題。

如果你可以移動到不同的事件,你就可以使用出here

可鏈接到這個老article

在那裏你創建一個BaseHttpModule來然後創建事件

的技術,你可以通過上下文進入處理程序

public abstract class BaseHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += (sender, e) => OnBeginRequest(new HttpContextWrapper(((HttpApplication) sender).Context)); 
     context.Error += (sender, e) => OnError(new HttpContextWrapper(((HttpApplication) sender).Context)); 
     context.EndRequest += (sender, e) => OnEndRequest(new HttpContextWrapper(((HttpApplication) sender).Context)); 
    } 

    public void Dispose() 
    { 
    } 

    public virtual void OnBeginRequest(HttpContextBase context) 
    { 
    } 

    public virtual void OnError(HttpContextBase context) 
    { 
    } 

    public virtual void OnEndRequest(HttpContextBase context) 
    { 
    } 
} 

那麼你的類成爲

public class RemoveServerHeadersModule : BaseHttpModule 
{ 
    public override void OnBeginRequest(HttpContextBase context) 
    { 
     context.Response.Headers.Remove("X-Powered-By"); 
     context.Response.Headers.Remove("X-AspNet-Version"); 
     context.Response.Headers.Remove("X-AspNetMvc-Version"); 
     context.Response.Headers.Remove("Server"); 
    } 
} 

,你的測試是一樣的東西

 var fakeContext = A.Fake<HttpContextBase>(); 
     var fakeRequest = A.Fake<HttpRequestBase>(); 
     var fakeResponse = A.Fake<HttpResponseBase>(); 

     A.CallTo(() => fakeResponse.Headers).Returns(/*put your headers here*/); 

     A.CallTo(() => fakeContext.Response).Returns(fakeResponse); 
     A.CallTo(() => fakeContext.Request).Returns(fakeRequest); 

     var _sut = new RemoveServerHeadersModule(); 
     _sut.OnBeginRequest(fakeContext); 

     //your header checks. 
+0

的OP是使用'HttpModule',而不是一個'Controller'。 – NightOwl888

+0

@ NightOwl888你是對的。我會更新我的答案。 – Fran

+0

非常感謝您的回覆。 有一個查詢..我需要附加其他事件(OnError,OnEndRequest)從OnBeginRequest以來,因爲我使用 OnBeginRequest僅在RemoveServerHeadersModule。 請讓我知道 – Das