编写单元测试引用UI控件的类

时间:2009-06-15 16:39:39

标签: c# .net asp.net unit-testing

我有一个User控件继承的抽象类,我想编写单元测试。我知道我需要创建一个模拟类来测试抽象类。抽象类具有对UI控件的引用(例如:将Web控件作为参数的基本方法)。我的问题是,如何将单元测试编写到引用System.Web.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");
    }

}

3 个答案:

答案 0 :(得分:2)

我的回答是'什么阻止你写这些测试?' (我需要更多的代码上下文来提供更详细的答案)

像对待代码的任何其他协作者/依赖项一样对待它们。如果UI控件很容易在测试套件中创建 - 你应该继续&建立他们的状态,采取行动并坚持你的期望 如果创建UI控件不容易或不昂贵,请使用界面(仅包含我们与控件交互的方法)将它们抽象出去。插入mock / fake / stub实现。

我也可以添加,尽可能减少用户界面。

答案 1 :(得分:2)

您可以尝试为测试目的创建这些Web控件的实例,或者如果不可能的话,您也可以将它们模拟起来。如果您预计需要多个单元测试的模型,请不要犹豫,花时间。

如果你的代码只依赖于接口而不是具体的类会更容易,因为那样你就可以模拟一个接口,而不必模拟整个类。

如果代码和System.Web.UI控件之间存在一些抽象层,那将会更容易。这可能会使测试和维护变得更容易。

我想我的观点是,设计代码是可以进行单元测试的。

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

答案 2 :(得分:0)

根据我对你的问题的理解,你需要为你的抽象派生类创建一个控件来初始化。所以你需要创建一个具体的类来测试你的抽象类;你还需要模拟它将用来初始化自己的web控件(来自你的例子)。