簡體   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