繁体   English   中英

访问控件的单元测试方法

[英]Unit testing methods which access controls

是否可以测试任何访问winform控件的方法? 以下方法访问表单上的一系列控件中的Enabled属性。 不幸的是,我不知道如何对它进行单元测试/如果可能的话。

我非常欣赏一些指示。

    public void AccessToCsvFileVerificationInputs(bool access)
    {
        btnSelectCSVFilePath.Enabled = access;
        nudNumberOfColumns.Enabled = access;
        cbCurrencyPair.Enabled = access;

        foreach (Control input in tlpColumnDataTypes.Controls)
        {
            input.Enabled = access;
        }

        foreach (Control input in tlpColumnNames.Controls)
        {
            input.Enabled = access;
        }

        nudInitialRow.Enabled = access;
        nudFinalRow.Enabled = access;

        btnSelectErrorLogFilePath.Enabled = access;
    }

我发现最好的方法是将应用程序的设计转换为某种形式的Model-View- *模式,其中Winforms Model-View-Presenter 1通常很适合。

这样,您就拥有一个负责所有逻辑的演示者/控制器类,并且您拥有保存UI代码的视图。 在Winforms中,你通常会实现这一点,让你的表单类实现一个IView接口,定义它可以做的一切。

然后,您将表单(将其声明为接口)传递给演示者 - 构造函数Dependency Injection是传递它的典型方式。


因此,在您的示例中,您将AccessToCsvFileVerificationInputs方法移动到presenter类中,并向演示者传递实现正确接口的表单实例,并说明该表单可以执行的所有操作。

像这样的东西:

public class CsvFilePresenter
{
    private ICsvFileView view_;
    public CsvFilePresenter(ICsvFileView view)
    {
        view_ = view;
    }

    public void AccessToCsvFileVerificationInputs(bool access)
    {
        // Code omitted for brevity
    }
}

现在,在那个你直接引用控件之类的UI功能的地方,你可以改为引用接口:

public void AccessToCsvFileVerificationInputs(bool access)
{
    view_.EnableSelectCSVFilePath = access;
    view_.EnableNumberOfColumns = access;
    view_.EnableCurrencyPair = access;

    // And so on...
}

我故意将控制集合排除在外 - 你如何处理这些集合取决于具体细节。

例如,您有这个ICsvFileView接口:

public interface ICsvFileView 
{
    bool EnableSelectCSVFilePath { get; set; }
    bool EnableNumberOfColumns { get; set; }
    bool EnableCurrencyPair { get; set; }        
}

此ICsvFileView的具体实现可能如下所示:

public partial class Form3 : Form, ICsvFileView
{
    public Form3()
    {
        InitializeComponent();
    }

    bool ICsvFileView.EnableSelectCSVFilePath
    {
        get
        {
            return btnSelectCsvFilePath.Enabled;
        }
        set
        {
            btnSelectCsvFilePath.Enabled = value;
        }
    }

    bool ICsvFileView.EnableNumberOfColumns
    {
        get
        {
            return nudNumberOfColumns.Enabled;
        }
        set
        {
            nudNumberOfColumns.Enabled = value;
        }
    }

    bool ICsvFileView.EnableCurrencyPair
    {
        get
        {
            return cbCurrencyPair.Enabled;
        }
        set
        {
            cbCurrencyPair.Enabled = value;
        }
    }
}

现在您已经完成了这项工作,您可以通过传入一个模拟的接口实例并设置对该模拟的期望来测试逻辑的行为(由演示者表示)及其与View的交互。


请注意 ,如果所有这些看起来有点复杂和复杂,那是因为它! Winforms并没有真正考虑到这种事情 - 其他框架如WPF也让这一切变得更加容易。 如果你可以改变,我建议考虑一下。


1我链接到的网页上的Martin Fowler已经退出了这种模式,将其转换为两种不同的模式 - 我会保留术语,因为它是众所周知的。 他的新Passive View与我一直看到MVP的方式非常接近。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM