如何对私有 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.CheckedrbtnOracle.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 窗体进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何对私有 Cocoapods 库进行单元测试?

如何使用私有构造函数对类进行单元测试?

如何在Typescript中对私有方法进行单元测试

如何通过phpunit对一个方法进行单元测试,该方法具有多个内部调用保护/私有方法?

如何在 Swift 中对私有或内部函数进行单元测试?

golang:如何对私有函数进行单元测试