gpt4 book ai didi

c# - 访问控制的单元测试方法

转载 作者:行者123 更新时间:2023-11-30 15:03:14 24 4
gpt4 key购买 nike

是否可以测试任何访问 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 通常很合适。

这样您就有了一个负责所有逻辑的呈现器/ Controller 类,并且您拥有了包含 UI 代码的 View 。在 Winforms 中,您通常通过让表单类实现一个 IView 接口(interface)来实现这一点,该接口(interface)定义了它可以执行的所有操作。

然后您将表单(将其作为接口(interface)传递)提供给演示者 - 构造函数依赖注入(inject)是传递它的典型方式。


因此,在您的示例中,您将 AccessToCsvFileVerificationInputs 方法移至 Presenter 类,并向 Presenter 传递一个实现正确接口(interface)的表单实例,说明该表单可以执行的所有操作。

像这样:

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 接口(interface):

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;
}
}
}

现在您已完成此操作,您可以通过传入接口(interface)的模拟实例并对该模拟设置期望来测试您的逻辑行为(如演示者所表达的那样)及其与 View 的交互。


请注意,如果这一切看起来有点复杂和令人费解,那是因为它确实如此! Winforms 在设计时并没有真正考虑到这种事情 - 其他框架(例如 WPF)使这一切变得更加容易。如果可以改变,我建议考虑一下。


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

关于c# - 访问控制的单元测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11810446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com