繁体   English   中英

.NET:我如何对这种方法进行单元测试?

[英].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 )。

如果您特别禁止重构该方法并且还需要对其进行测试,则可以使用绕行系统(如MolesTypeMock Isolator )来完全绕过静态和HttpContext调用。 然而,这可能会有点难看,而且对原始代码执行重构更为可取。


绕道模拟的顺序是:

  1. 绕道HttpContext.Current返回一个HttpContext绕道存根(你自己的实现符合HttpContext类接口,但看起来与测试代码的HttpContext完全相同。)

  2. 在你的HttpContext绕行存根中,模拟Application [“myValue”]来返回你想要的值(在这种情况下为null或非null。)这可能需要为Application的返回值创建一个detour类。

  3. 现在您可以配置绕行并运行您的方法。 对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM