単体テストには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 つのケースのいずれかを解決することは可能ですか、それとも私のシナリオの単体テストに別のアイデア/アプローチを取ることは可能ですか。
ありがとう、ラストコ