【问题标题】:What block is not being tested in my test method? (VS08 Test Framework)我的测试方法中没有测试哪个块? (VS08 测试框架)
【发布时间】:2010-06-01 08:30:00
【问题描述】:

我有以下代码:

private void SetControlNumbers()
    {
        string controlString = "";
        int numberLength = PersonNummer.Length;

        switch (numberLength)
        {
            case (10) :
                controlString = PersonNummer.Substring(6, 4);
                break;
            case (11) :
                controlString = PersonNummer.Substring(7, 4);
                break;
            case (12) :
                controlString = PersonNummer.Substring(8, 4);
                break;
            case (13) : 
                controlString = PersonNummer.Substring(9, 4);
                break;
        }

        ControlNumbers = Convert.ToInt32(controlString);
    }

使用以下测试方法进行测试:

[TestMethod()]
    public void SetControlNumbers_Length10()
    {
        string pNummer = "9999999999";
        Personnummer target = new Personnummer(pNummer);
        Assert.AreEqual(9999, target.ControlNumbers);
    }

    [TestMethod()]
    public void SetControlNumbers_Length11()
    {
        string pNummer = "999999-9999";
        Personnummer target = new Personnummer(pNummer);
        Assert.AreEqual(9999, target.ControlNumbers);
    }

    [TestMethod()]
    public void SetControlNumbers_Length12()
    {
        string pNummer = "199999999999";
        Personnummer target = new Personnummer(pNummer);
        Assert.AreEqual(9999, target.ControlNumbers);
    }

    [TestMethod()]
    public void SetControlNumbers_Length13()
    {
        string pNummer = "1999999-9999";
        Personnummer target = new Personnummer(pNummer);
        Assert.AreEqual(9999, target.ControlNumbers);
    }

出于某种原因,Visual Studio 说我有 1 个未测试的块,尽管被测方法中的所有代码都显示为蓝色(即代码包含在我的单元测试中)。这是因为我没有在开关中定义默认值吗?当调用 SetControlNumbers() 方法时,它所操作的字符串已经被验证并检查它是否符合规范,并且开关中的各种 Substring 调用将生成一个包含 4 个字符的字符串。我只是好奇为什么它说有 1 个未经测试的块。我根本不是单元测试专家,所以我很想对此提供一些反馈。

另外,除了添加 try-catch 块并检查 FormatExceptions 和 OverflowExceptions 之外,我如何改进切换后的转换以使其更安全?

【问题讨论】:

  • 当数字为 13 时会发生什么?
  • 不会调用此代码,因为在调用 SetControlNumbers 之前会引发异常。
  • switch语句中没有默认值
  • 啊,你说的很对。我添加了一个默认方法和一个测试方法,我的代码覆盖率跃升至 100%。嗬!谢谢! :-) 写一个答案,我会接受的。
  • 我怀疑 VS 能够解决这个问题。它只是看到一个缺失的default。 (事实上​​,经验让我怀疑人类能否可靠地解决这个问题。)

标签: c# .net visual-studio unit-testing code-coverage


【解决方案1】:

您需要在 switch 语句中添加一个默认部分以捕获未明确定义的情况。

private void SetControlNumbers()
{
    string controlString = "";
    int numberLength = PersonNummer.Length;

    switch (numberLength)
    {
        case (10) :
            controlString = PersonNummer.Substring(6, 4);
            break;
        case (11) :
            controlString = PersonNummer.Substring(7, 4);
            break;
        case (12) :
            controlString = PersonNummer.Substring(8, 4);
            break;
        case (13) : 
            controlString = PersonNummer.Substring(9, 4);
            break;
        default:
            //decide what to do here, 
            //could do this or something more appropriate for your situation
            throw new NotSupportedException("An invalid PersonNummer.Length value was encountered.")
    }

    ControlNumbers = Convert.ToInt32(controlString);
}

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2010-11-09
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多