【问题标题】:How to unit test private Windows Forms?如何对私有 Windows 窗体进行单元测试?
【发布时间】: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")]

但这是将每个私有价值都转化为内部价值的好方法吗?

【问题讨论】:

    标签: c# unit-testing private


    【解决方案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 测试的特定测试框架。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-11
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        相关资源
        最近更新 更多