我正在使用MSTest为ASP.NET项目编写一系列单元测试。一些正在测试的代码假定HttpContext.Current
不为空,所以我正在设置一个虚拟HttpContext.Current
以避免在测试运行时抛出NullReferenceException
。
因为在我的情况下,HttpContext.Current
的实际内容并不重要 - 它只需要非空 - 我最初的方法是在我的测试中只设置一次虚拟HttpContext.Current
class的AssemblyInitialize
方法,让所有测试方法都使用它。
这适用于单一测试方法。但是,在每个测试方法完成后,我发现HttpContext.Current
将变为空,第二次和后续测试将因此失败。
这是一个简化的完整测试类,用于说明此行为:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Web;
using System.IO;
[TestClass]
public class UnitTest1
{
[AssemblyInitialize]
public static void RunOnceBeforeTestsBegin(TestContext context)
{
// Set up a dummy HttpContext.Current for testing
HttpRequest request = new HttpRequest("", "http://example.com/", "");
HttpResponse response = new HttpResponse(new StringWriter());
HttpContext.Current = new HttpContext(request, response);
}
[TestMethod]
public void TestMethod1()
{
Assert.IsNotNull(HttpContext.Current);
}
[TestMethod]
public void TestMethod2()
{
Assert.IsNotNull(HttpContext.Current);
}
}
在我的Visual Studio 2013中,当我在这个类中运行测试时:
HttpContext.Current
为空而失败。(我知道我可以通过为每个单独的测试方法设置一次假HttpContext.Current
来解决此问题,例如在TestInitialize
方法中。)
我的问题:为什么HttpContext.Current
在每个测试方法运行后都变为空?