代码之家  ›  专栏  ›  技术社区  ›  Henric

我的测试方法中没有测试哪个块?(VS08测试框架)

  •  1
  • Henric  · 技术社区  · 16 年前

    我有以下代码:

    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说我有一个块没有被测试,尽管它用蓝色显示了被测试方法中的所有代码(即,代码在我的单元测试中被覆盖)。这是因为我没有在开关中定义默认值吗?当调用setControlNumbers()方法时,它所操作的字符串已经过验证和检查,以确保它符合规范,并且开关中的各种子字符串调用将生成一个包含4个字符的字符串。我只是好奇为什么它说有1个未测试的块。我根本不是单元测试专家,所以我希望得到一些反馈。

    另外,除了添加一个try-catch块并检查formatExceptions和overflowExceptions之外,如何改进开关后的转换以使其更安全?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Sam Holder Brian Adams    16 年前

    您需要在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);
    }