6

単体テストにはHttpSimulatorを使用しています。私は、Response.Redirect 呼び出しのコード チェーンがより深い 1 つのメソッドをテストしています。私はここで問題に直面しています。私は得ています

System.NullReferenceException was unhandled by user code
  HResult=-2147467261
  Message= Object reference not set to an instance of an object.
  Source=System.Web
  StackTrace:
       at System.Web.HttpApplication.CompleteRequest()
       at System.Web.HttpResponse.End()
       at System.Web.HttpResponse.Redirect(String url, Boolean endResponse, Boolean permanent)
       at System.Web.HttpResponse.Redirect(String url, Boolean endResponse)

次に、HttpApplication タイプを反映し、言及されたメソッドを見つけました。

public void CompleteRequest()
{
    this._stepManager.CompleteRequest();
}

次のいずれかの方法で HttpApplication を初期化しています。

 HttpContext.Current.ApplicationInstance = new HttpApplication();
 // or with Mock framework
 var httpApplicationMock = new Mock<HttpApplication>()
 var applicationInstance = httpApplicationMock.Object;

ASP ドキュメントから得たように、_stepManager はモジュールとハンドラーの実行順序と調和を担当しています。このフィールドは、アプリケーションがクラシック モードか統合モードかによって初期化されます。

次に、テストで呼び出しました:

object stepManager = typeof(HttpApplication).GetField("_stepManager", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current.ApplicationInstance);

stepManagerがnullであることがわかりました。これは、上記の例外から予想されます。StepManager はメソッド内で初期化されます:

internal void InitInternal(HttpContext context, HttpApplicationState state, MethodInfo[] handlers)

したがって、これから stepManager を確実に初期化する方法を制御できません。

次に、 2 番目のシナリオを試しました。このシナリオでは、別の方法で ApplicationInstance を初期化しようとしました。

次のリンクからAppHost.cs

私はこのように ApplicationInstance を初期化しようとしました:

private static HttpApplication GetApplicationInstance()
{
   var writer = new StringWriter();
   var workerRequest = new SimpleWorkerRequest("", "", writer);
   var httpContext = new HttpContext(workerRequest);
   return (HttpApplication)getApplicationInstanceMethod.Invoke(null, 
           new object[] { httpContext });
}

そして、latメソッドの行に乗りました:

InnerException: System.InvalidOperationException
HResult=-2146233079
Message=This method cannot be called during the application's pre-start initialization phase.
Source=System.Web
StackTrace:
    at System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()
    at System.Web.Compilation.BuildManager.GetGlobalAsaxTypeInternal()
    at System.Web.Compilation.BuildManager.GetGlobalAsaxType()
    at System.Web.HttpApplicationFactory.CompileApplication()
    at System.Web.HttpApplicationFactory.Init()
    at System.Web.HttpApplicationFactory.EnsureInited()
    at System.Web.HttpApplicationFactory.GetApplicationInstance(HttpContext context)

私は3 番目のシナリオを試しました。Redirect メソッドをオーバーライドした HttpResponseBase から派生したカスタム Response を作成しました。しかし、作成した HttpContextBase を HttpContext.Current に割り当てる方法という問題に直面しています。Sergeiのブログでヒントを見ました :

HttpContext httpContext = httpContextBase.ApplicationInstance.Context;

ただし、ApplicationInstance に Context を設定することはできません。ヌルです。

これらの 3 つのケースのいずれかを解決することは可能ですか、それとも私のシナリオの単体テストに別のアイデア/アプローチを取ることは可能ですか。

ありがとう、ラストコ

4

0 に答える 0