6

我正在使用HttpSimulator进行单元测试。我正在测试一种在代码链调用 Response.Redirect 中有更深层次的方法。我在这里面临问题。我越来越

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 为空,这是上述异常所预期的。StepManager 在方法中初始化:

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

因此,由此我无法控制如何确保 stepManager 被初始化。

然后我尝试了第二种情况。在这种情况下,我尝试以其他方式初始化 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)

我已经尝试过第三种情况。我已经创建了从 HttpResponseBase 派生的自定义响应,它已经覆盖了 Redirect 方法。但我面临一个问题,如何将创建的 HttpContextBase 分配给 HttpContext.Current。我在Sergei 的博客上看到了提示 :

HttpContext httpContext = httpContextBase.ApplicationInstance.Context;

但是不能在 ApplicationInstance 上设置 Context。它是空的。

是否有可能解决这 3 个案例中的一个或采取另一种想法/方法来对我的场景进行单元测试。

谢谢你,拉斯特科

4

0 回答 0