2012-02-21 55 views
2

我正在查看使用ASP.NET編寫的遺留企業應用程序。沒有控件或Web表單。這是如何工作的:如何使ASP.NET Webforms應用程序可測試?

EmployeeList.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="EmployeeList.aspx.cs" Inherits="EmployeeList" %> 

EmployeeList.aspx.cs

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Security Check 

    // Load Template, get version 1.4 of active employee list 
    StringBuilder template = GetTemplate("Employee", "ActiveList", "1.4", true); 

    // Get list from database 
    using(SqlDataReader objReader = GetListFromDB()) 
    { 
     while(objReader.Read()) 
     { 
      //fills data 
      TUtils.Replace(template, ROW, "%name%", objReader[0]); 
     } 
    } 

    // return response 
    Response.Write(template.ToString()); 
} 

private StringBuilder GetTemplate(string x, string y, string v, bool z); 
{ 
    // returns template 
} 

private SqlDataReader GetListFromDB() { 
    // returns data reader 
} 

我的問題是,因爲我們沒有使用web表單,有沒有辦法在這個事件驅動模型中引入NUnit(如上所示)?

另外,請避免建議移動到ASP.NET MVC或其他圖案,這是我們正在考慮,但不知道有沒有什麼辦法來轉換這個企業應用程序測試。

+0

沒有簡單的答案在這裏。將所有想要測試的邏輯移動到可測試的地方(例如,這意味着要轉移到MVP/MVC類型的設計)。也許我的帖子 - http://madcoderspeak.blogspot.com/2012/02/gui-testing-rehab-can-we-start-saying.html可以讓你開始。只是在心裏翻譯GUI到WebGUI。 – Gishu 2012-02-22 05:37:32

回答

0

由於大部分代碼是在代碼隱藏,我不認爲有NUnit的/ Visual Studio的測試框架通常的測試方法將工作做好。

不過,我認爲一個可能的方法是使用的用戶界面測試框架,如WATIN/Selenium。這將使您仍然可以爲各種功能編寫測試。 我在過去做過類似的事情,主要是爲每個UI動作編寫一個測試用例,導致服務器回發。可能並不理想,但它確實可以讓您自動執行測試。

4

這是絕對有可能的。您應該看看使用ASP.NET Webforms實現MVP模式。有幾個開源實現,但你可以自己做一個更小的專業。

的基礎是背後的邏輯代碼移到presenterclass。演示者類具有對實現接口的頁面的引用。你的情況中的訣竅是模擬你的測試的Page.Response對象。這就是爲什麼單元測試很難正確。 PageResponse屬性包含一個派生自HttpResponseBase的對象,這就是您應該在您的測試中模擬的基類,並且使用您的示例進行斷言。你可以從這開始,然後擴展你的主持人功能如會話,請求等。

如果你根本沒有任何標記,那麼你可以在視圖構造器中創建主持人,並且不要打擾並參考了這個觀點。

澄清:大招是讓碼出aspx.cs文件。那隻野獸是不可測試的。

用於演示樣品基類:

public class Presenter<T> where T : class, IView 
    { 
     protected readonly T View; 

     protected Presenter(T view, ILogger logger) 
     { 
      View = view; 
     } 

     public virtual void page_PreRender(object sender, EventArgs e) 
     { 
     } 

     public virtual void page_Init(object sender, EventArgs e) 
     { 
     } 

     public virtual void page_Load(object sender, EventArgs eventArgs) 
     { 
     } 

     public HttpContextBase HttpContext { protected get; set; } 

     protected HttpRequestBase Request 
     { 
      get { return HttpContext.Request; } 
     } 
    }