孔隙法的单元试验C#

孔隙法的单元试验C#,c#,unit-testing,C#,Unit Testing,我正试图为void方法编写一个单元测试。但是,我找不到任何例子或明确的答案。下面是我在程序中使用的一种方法,我想为此编写一个单元测试。在这方面有人能帮我吗。提前谢谢 //method for disable all comboBoxes private void comboDisable() { foreach (var j in this.Controls) { if (j.GetType().Equals(ty

我正试图为void方法编写一个单元测试。但是,我找不到任何例子或明确的答案。下面是我在程序中使用的一种方法,我想为此编写一个单元测试。在这方面有人能帮我吗。提前谢谢

    //method for disable all comboBoxes
    private void comboDisable() 
    {
        foreach (var j in this.Controls)
        {
            if (j.GetType().Equals(typeof(ComboBox)))
            {
                ComboBox cmb = j as ComboBox;
                cmb.Enabled = false;
            }
        }
    }

正如一些人提到的,您确实应该将业务逻辑与UI分离。我在这里看到的问题是,单元测试是什么?您是否正在尝试查看某个组合框是否已禁用?如果所有组合框都已禁用


我的建议是非常。。。有问题。但是,如果您想用UI对逻辑进行单元测试。。。也许创建一个空的组合框集合,将每个被禁用的组合框添加到该集合中,然后让该方法返回禁用的组合框集合。然后可能会断言它们都被禁用。

正如前面提到的,单元测试通常针对应用程序逻辑公共方法,而不是与UI相关的方法

如果你真的坚持要测试你的方法,你应该遵循以下步骤:

1) 设置阶段-这是一个初始化测试上下文的阶段。在您的情况下,初始化和打开包含组合框的表单

2) 拆卸阶段-这是一个让测试保持从未运行的阶段。例如,关闭并以您的形式进行处理

3) 实际测试-获取一些组合框实例,启用它们,调用您的方法,检查所有复选框是否已禁用

一些(伪)代码使用(未经测试,只是让您开始):

这假设您的方法是公共的,并且也是经过测试的组合框。从理论上讲,您可以这样做,但这确实很难看,不推荐这样做(方法重命名产生了一个
TargetInvocationException
,而不是编译错误)


这应该为单元测试的创建提供一个基本的想法,但是你真的应该这样做。

你在哪里?编码技巧:简化
if(j.GetType().Equals(typeof(ComboBox))
if(j是ComboBox)
。再往前走一步,您就可以消除这种情况&只需将
var cmb=j写为组合框;如果(cmb!=null){cmb.Enabled=false;}
此代码正在工作。我正试图为这个方法编写一个单元测试用例,但我不确定如何处理和编写什么?至于单元测试无效方法——通常,这样的方法会起到一些作用。单元测试将验证是否完成了某些操作。强调效果。(如果编写的代码不能做到这一点,重构直到可以。)单元测试检查特定的功能,这些功能会改变对象的状态。因此,在执行此功能后,您将比较对象的预期状态和实际状态。因此,您需要重写方法以获取Combobox集合作为参数。然后在方法调用后检查。无论如何,你需要访问你的目标对象。嫌疑犯u未找到被视为实现细节的私有方法的答案,并且未对其进行测试。
[TestFixture]
public class YourFormTests
{
    private Form frm;

    [OneTimeSetUp]
    public void SetUp()
    {
        frm = new Form();
        frm.Show();
    }

    [OneTimeSetup]
    public void TearDown()
    {
        frm?.Close();
        frm?.Dispose();
    }

    [Test]
    public void TestComboDisabled()
    {
        frm.cmbSomeName.Enabled = true;
        frm.comboDisable();
        Assert.IsFalse(frm.cmbSomeName.Enabled, "Combo is not disabled");
    } 
}