为 .Net 单元测试设置 HttpContext

Posted

技术标签:

【中文标题】为 .Net 单元测试设置 HttpContext【英文标题】:Setting up HttpContext for .Net Unit Tests 【发布时间】:2022-01-09 23:36:13 【问题描述】:

我正在为操作方法MethodUnderTest 编写单元测试(使用NUnitMOQ),该方法在内部使用HttpContext 来执行某些功能。我正在通过调用InitializeHostingEnvironment 来设置一个假的托管环境,我正在初始化会话,例如:

public static HttpSessionState InitializeSession()
        
            var httpRequest = new HttpRequest("", "http://localhost/", "");
            var stringWriter = new StringWriter();
            var httpResponse = new HttpResponse(stringWriter);
            var httpContext = new HttpContext(httpRequest, httpResponse);
    
            HttpContext.Current = httpContext;
            HttpContext.Current.Items.Clear();
            HttpSessionState session = (HttpSessionState)ReflectionHelper.Instantiate(typeof(HttpSessionState), new Type[]  typeof(IHttpSessionState) , new FakeHttpSessionState());

            HttpContext.Current.Items.Add("AspSession", session);

            return session;
        

public static void InitializeHostingEnvironment(string userName, string password)

     // lines of code
     InitializeSession();

我从我的测试方法中调用InitializeHostingEnvironment(),如下所示:

public static void Test_MethodUnderTest()

   InitializeHostingEnvironment(UN, PW);
   MethodUnderTest(param1, param2, param3); -- getting exception while trying to execute this line

在尝试执行 MethodUnderTest(param1, param2, param3); 行时,我遇到了一个异常 - System.ArgumentNullException - Value cannot be null. Parameter name httpBrowserCapabilities。堆栈跟踪如下:

由于异常说 httpBrowserCapabilities 为空,我尝试在 InitializeSession() 方法中像 HttpContext.Current.Request.Browser = new HttpBrowserCapabilities(); 一样初始化它,但是现在,我遇到了另一个异常:

我现在该怎么办?我初始化HttpContext 的方式错了吗?请指教。

【问题讨论】:

为什么要测试连接器而不是连接结果?我认为您在定义级别误解了 UT 您可能有正当理由需要测试您正在测试的内容。但是您没有向我们展示错误。您向我们展示了抛出异常的位置,但您已经切断了实际错误。如果这些失败的测试真的表明代码中有错误怎么办?与其剪切和粘贴图片,不如复制文本。我们不需要整个堆栈跟踪,但至少需要开始 - 异常类型、消息以及它被抛出的位置。 【参考方案1】:

我正在为 MethodUnderTest 方法编写单元测试(使用 NUnit 和 MOQ),该方法在内部使用 HttpContext 来执行某些功能。

没错。不要那样做。控制器应该是访问 HttpContext 的唯一方法,它应该提取 MethodUnderTest 所需的数据并使用 写入 HttpContext。

构建代码以使每个方法都有一个 single responsibility 是编写可测试代码的基础。

【讨论】:

您好@***.com/users/7297700/david-browne-microsoft 对任何混淆表示歉意,但 MethodUnderTest 是一种操作方法。我现在用同样的方法编辑了我的问题。谢谢!

以上是关于为 .Net 单元测试设置 HttpContext的主要内容,如果未能解决你的问题,请参考以下文章

单元测试 IHttpModule

模拟HttpContext单元测试

在单元测试中设置 HttpContext.Current.Session

模拟 HttpContext 不起作用

在测试初始化​​方法中模拟 HttpContext.Current

在当前 HTTPContext 中生成新的 ASP.NET 会话