2009-06-15 53 views
2

我有一個用戶控件繼承的抽象類,我想爲其編寫單元測試。我知道我需要創建一個模擬類來測試抽象類。抽象類引用了​​UI控件(例如:以Web控件作爲參數的基本方法)。我的問題是,如何將單元測試寫入任何引用System.Web.UI命名空間中的控件的方法?編寫單元測試引用UI控件的類

感謝

編輯: 下面的代碼的一個例子,我有

public abstract SpecialUserControl : System.Web.UI.UserControl 
{ 
    protected virtual void DoSomething(TextBox txtBoxName) 
    { 
     //Here's the logic I want to write unit test for 
    } 
} 

在ascx.cs

public partial class MyUsercontrol : SpecialUserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    base.DoSomething(txtBoxName); 
    } 

} 

在aspx.cs

public partial class SomePage : BasePage 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Dynamically loaded 
     LoadControl("MyUserControl.ascx"); 
    } 

} 

回答

0

從我所瞭解的問題中,您將需要爲您的抽象派生類創建一個控件來初始化。所以你需要創建一個具體的類來測試你的抽象類;您還需要模擬將用於初始化自身的Web控件(從您的示例中)。

2

我的回答是'什麼阻止你寫這些測試?' (我需要更多的代碼上下文來給出更詳細的答案)

對待它們就像任何其他合作者/您的代碼的依賴項。如果UI控件很容易在測試套件中創建 - 那麼您應該繼續&設置它們的狀態,對它們採取行動並表達您的期望。
如果UI控件創建起來不容易或昂貴,可以使用界面(僅包含我們與控件交互的方法)將它們抽象出來,插入模擬/僞造/存根實現。

我也可以添加,保持UI儘可能薄。

2

您可以嘗試爲測試目的創建這些Web控件的實例,或者如果不可能,也可以將它們嘲笑。如果您預見需要多組單元測試的模型,請不要猶豫,花時間。

如果你的代碼僅僅依賴接口而不是具體的類,那將會更容易,因爲那樣你就可以模擬一個接口而不必模擬整個類。

如果您的代碼和System.Web.UI控件之間存在一些抽象層,那麼它會更容易。這可能會使測試和維護變得更容易。

我想我的觀點是,有這樣的事情,設計代碼是單元測試。

如果您提供更具體的方案,可能會提供一些更具體的建議。