我有一个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");
}
}
答案 0 :(得分:2)
我的回答是'什么阻止你写这些测试?' (我需要更多的代码上下文来提供更详细的答案)
像对待代码的任何其他协作者/依赖项一样对待它们。如果UI控件很容易在测试套件中创建 - 你应该继续&建立他们的状态,采取行动并坚持你的期望 如果创建UI控件不容易或不昂贵,请使用界面(仅包含我们与控件交互的方法)将它们抽象出去。插入mock / fake / stub实现。
我也可以添加,尽可能减少用户界面。
答案 1 :(得分:2)
您可以尝试为测试目的创建这些Web控件的实例,或者如果不可能的话,您也可以将它们模拟起来。如果您预计需要多个单元测试的模型,请不要犹豫,花时间。
如果你的代码只依赖于接口而不是具体的类会更容易,因为那样你就可以模拟一个接口,而不必模拟整个类。
如果代码和System.Web.UI控件之间存在一些抽象层,那将会更容易。这可能会使测试和维护变得更容易。
我想我的观点是,设计代码是可以进行单元测试的。
如果您提供更具体的方案,可能会有更具体的建议。
答案 2 :(得分:0)
根据我对你的问题的理解,你需要为你的抽象派生类创建一个控件来初始化。所以你需要创建一个具体的类来测试你的抽象类;你还需要模拟它将用来初始化自己的web控件(来自你的例子)。