如何对私有 Windows 窗体进行单元测试?
Posted
技术标签:
【中文标题】如何对私有 Windows 窗体进行单元测试?【英文标题】:How to unit test private Windows Forms? 【发布时间】:2021-12-14 07:34:19 【问题描述】:我是单元测试的初学者,目前遇到了第一个问题。
我想对我的CheckedChange
函数进行单元测试:
protected void rbtnMSSQL_CheckedChanged(object sender, EventArgs e)
if (rbtnMSSQL.Checked && rbtnOracle.Checked)
rbtnOracle.Checked = false;
好吧,如果我想断言,我需要来自rbtnMSSQL.Checked
和rbtnOracle.Checked
的布尔值,但它们是私有的。
我猜它可以与内部和
[assembly: InternalsVisibleTo("UnitTests")]
但这是将每个私有价值都转化为内部价值的好方法吗?
【问题讨论】:
【参考方案1】:私有的东西被用来使事情在类中工作。
单元测试应该断言类是如何工作的,如果它返回正确的值等等。
最终,为复选框设置值应该由某个控制器或视图模型完成(如果您使用了正确的设计模式),并且此设置正确的值将是公开的(视图可见)。这样就可以进行单元测试了。
因此,也许不是您要寻找的答案,但您需要重新设计部分代码或整个视图(拆分为视图和视图模型)。
【讨论】:
【参考方案2】:很难对有副作用的函数进行单元测试。通常,您应该只为没有副作用的函数创建单元测试。为此,从事件处理程序中提取实际功能并从事件处理程序中调用它:
protected void rbtnMSSQL_CheckedChanged(object sender, EventArgs e)
DisableOtherCheckBoxWhenOneWasChecked(rbtnMSSQL, rbtnOracle);
// Actually put that function in a separate class.
public void DisableOtherCheckBoxWhenOneWasChecked(CheckBox checkedChanged, CheckBox other)
if (checkedChanged.Checked && other.Checked)
other.Checked = false;
现在您可以为DisableOtherCheckBoxWhenOneWasChecked
编写单元测试并传入您自己的 CheckBox 对象。
一般来说,单元测试并不是测试 UI 内容的好工具。您应该查看用于 UI 测试的特定测试框架。
【讨论】:
以上是关于如何对私有 Windows 窗体进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章