【问题标题】:Writing Unit tests for a class that references UI controls为引用 UI 控件的类编写单元测试
【发布时间】:2010-11-03 02:00:28
【问题描述】:

我有一个用户控件继承自的抽象类,我想为其编写单元测试。我知道我需要创建一个模拟类才能测试抽象类。抽象类具有对 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");
    }

}

【问题讨论】:

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


    【解决方案1】:

    我的回答是“是什么阻碍了您编写这些测试?” (我需要更多的代码上下文来给出更详细的答案)

    像对待您的代码的任何其他协作者/依赖项一样对待它们。如果 UI 控件很容易在测试套件中创建 - 您应该继续设置它们的状态,对它们采取行动并维护您的期望。
    如果 UI 控件不容易创建或创建成本高昂,请使用接口(仅包含我们与控件交互的方法)将它们抽象出来并插入模拟/假/存根实现。

    我还可以补充一点,尽可能保持 UI 简洁。

    【讨论】:

      【解决方案2】:

      您可以尝试为您的测试创建这些 Web 控件的实例,或者如果不可能,您也可以模拟它们。如果您预见到多组单元测试需要模型,不要犹豫,花时间。

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

      如果您的代码和 System.Web.UI 控件之间有一些抽象层,那就更容易了。这可能使测试和维护更容易。

      我想我的意思是,设计代码是可单元测试的。

      如果您给出更具体的场景,可能会有更具体的建议。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2019-11-05
          • 2010-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-22
          相关资源
          最近更新 更多