首页 > 解决方案 > 如何从 HostingEnvironment 中“取消托管”

问题描述

我目前正在为 ASP Net MVC 应用程序编写单元测试,我必须模拟的一件事是 HTTP 请求。为此,我使用 HttpSimulator 库(Subtext.TestLibrary)。

我调用 SimulateRequest() 方法,它所做的一件事就是创建一个 HostingEnvironment 对象。

_httpSimulator = new HttpSimulator().SimulateRequest(new Uri());

在模拟 HTTP 请求之前,我必须在我的代码中使用 HostingEnvironment.IsHosted 属性的值(在条件语句中)。

第一次测试一切正常,因为我得到了 HostingEnvironment.IsHosted 的正确值(这是 FALSE)。

但是,当 SimulateRequest() 创建 HostingEnvironment 对象时,HostingEnvironment.IsHosted 变为 TRUE,因此当第二次测试运行时,我收到一个 TRUE 值,这会导致错误的结果(或异常)。

HostingEnvironment environment = new HostingEnvironment();

因此,我试图找到一种方法将 HostingEnvironment.IsHosted 重置为 FALSE。但是,此属性是只读的。

我也看不到任何会重置此属性的方法(我希望 Terminate、Finalize 或其他任何可能的方法)。

标签: c#.netasp.net-mvcunit-testing

解决方案


听起来您的测试与使用同一 HostingEnvironment() 实例的多个测试过于紧密地耦合在一起。

每个测试通常应该相互独立地执行,以便例如测试 1 的结果不会对例如测试 2 的结果产生任何影响。

只需使用单独的实例HostingEnvironment()

 [Test]
 public void InitializeContext()
 {
     using (HttpSimulator simulator = new HttpSimulator())
     {
        //Test #1...
     }
 }

[Test]
public void Simulator_Assigns_CurrentContext()
{
    using (HttpSimulator simulator = new HttpSimulator())
    {
        //Test #2...
    }
}

推荐阅读