2009-06-15 52 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控件之间存在一些抽象层,那么它会更容易。这可能会使测试和维护变得更容易。

我想我的观点是,有这样的事情,设计代码是单元测试。

如果您提供更具体的方案,可能会提供一些更具体的建议。