Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为引用UI控件的类编写单元测试_C#_.net_Asp.net_Unit Testing - Fatal编程技术网

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

C# 为引用UI控件的类编写单元测试,c#,.net,asp.net,unit-testing,C#,.net,Asp.net,Unit Testing,我有一个用户控件继承自的抽象类,我想为其编写单元测试。我知道我需要创建一个模拟类来测试抽象类。抽象类具有对UI控件的引用(例如:将web控件作为参数的基本方法)。我的问题是,如何为引用System.Web.UI命名空间中控件的任何方法编写单元测试 谢谢 编辑: 下面是我的代码示例 public abstract SpecialUserControl : System.Web.UI.UserControl { protected virtual void DoSomething(TextB

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

}

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

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

对待它们就像对待代码的任何其他协作者/依赖项一样。如果UI控件很容易在测试套件中创建,那么您只需继续并设置它们的状态,对它们进行操作并声明您的期望值。
如果UI控件不容易创建或创建成本不高,那么可以使用一个接口(只包含与控件交互的方法)将它们抽象出来&插入mock/fake/stub实现


我还想补充一点,让UI尽可能精简。

为了测试的目的,您可以尝试创建这些web控件的实例,如果不可能的话,也可以对它们进行模拟。如果您预见到需要多组单元测试的实体模型,请毫不犹豫地花时间

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

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

我想我的观点是,有一种设计代码是可单元测试的

如果你给出一个更具体的场景,可能会有更具体的建议