[英].NET: how can I unit test this method?
(类似于.NET如何捏造HttpContext对象 !)
我有一个我想测试的方法:
public void MyMethod()
{
if (HttpContext.Current.Application["myValue"] != null)
Console.WriteLine("Boo!");
}
如何在不重构方法的情况下编写测试,以便命中Console.WriteLine
?
我尝试过:
TextWriter tw = new StringWriter();
HttpWorkerRequest wr = new SimpleWorkerRequest("/webapp", @"path...", "logon.asp", "", tw);
HttpContext.Current = new HttpContext(wr);
HttpContext.Current.Application.Add("KeyValue", "myValue");
MyMethod();
但是HttpContext.Current.Application.count始终为零,我无法为其添加值!
问题是你应该重构这个方法,以便更容易测试! 要正确测试这个,你想模拟HttpContext
(这是一个例子: 如何使用Rhino Mocks来模拟HttpContext.Application )。
如果您特别禁止重构该方法并且还需要对其进行测试,则可以使用绕行系统(如Moles或TypeMock Isolator )来完全绕过静态和HttpContext调用。 然而,这可能会有点难看,而且对原始代码执行重构更为可取。
绕道模拟的顺序是:
绕道HttpContext.Current返回一个HttpContext绕道存根(你自己的实现符合HttpContext类接口,但看起来与测试代码的HttpContext完全相同。)
在你的HttpContext绕行存根中,模拟Application [“myValue”]来返回你想要的值(在这种情况下为null或非null。)这可能需要为Application的返回值创建一个detour类。
现在您可以配置绕行并运行您的方法。 对HttpContext.Current和HttpContext方法的调用将通过Profiling API重新路由到您的绕行存根。
您可以使用www.koders.com上的 HttpSimulator
类- Subtext.TestLibrary
只是调用
new Subtext.TestLibrary.HttpSimulator().SimulateRequest();
正确设置您的HttpContext
,因此您还可以向Application
字典添加值。
正如Jeff所说,它使用Reflection设置HttpApplicationFactory._theApplicationFactory._state
,如下所示,但实际上你不必为此烦恼。
Type appFactoryType = Type.GetType("System.Web.HttpApplicationFactory, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
object appFactory = ReflectionHelper.GetStaticFieldValue<object>("_theApplicationFactory", appFactoryType);
ReflectionHelper.SetPrivateInstanceFieldValue("_state", appFactory, HttpContext.Current.Application);
HttpContext.Application
由您无法正常访问的私有单例提供。
你可以通过反思设置这个,但我个人甚至都不会打扰。
相反,您应该将可测试代码与HttpContext.Current
类的全局状态隔离开:只需将您要查找的值传递给您要测试的方法。
您可以清楚地看到问题在Reflector中 (或者如果您已经下载了.NET代码中的代码): HttpContext.Application
get访问器每次调用它时都会返回一个新的HttpApplicationState
实例,除非某些内容(如ASP)。 NET框架)设置HttpApplicationFactory._theApplicationFactory._state
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.