2017-10-13 26 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でコンテキストを設定しようとするとエラーが発生します。 あなたがイベントOnPreSendRequestHeadersを使用すべきではない、マイクロソフトによってguidanceパー

答えて

0

私を助けることができるしてください

あなたがPreSendRequestHeadersとネイティブIISモジュールと PreSendRequestContextイベントを、使用することができますが、それらを使用していない

がIHttpModuleを実装する管理対象モジュール。これらのプロパティを設定すると、 の非同期要求で問題が発生する可能性があります。

あなたが別のイベントに移動することができれば、あなたは、あなたは、あなたが渡すことができ、イベントを作成するためのBaseHttpModuleを作成し、この古いarticle

にリンクhere

を示す技術を使用することができますハンドラ

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"); 
    } 
} 

とテストはOPは `Controller`、` HttpModule`をいない使用している

 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

のようなものです。 – NightOwl888

+0

@ NightOwl888あなたは正しいです。私は私の答えを更新します。 – Fran

+0

ありがとうございました。 1つのクエリがあります.を使用しているので、OnBeginRequest以外の他のイベント(OnError、OnEndRequest)を添付する必要があります.OnBeginRequestはRemoveServerHeadersModuleでのみ使用してください。 私に知らせてください – Das

関連する問題