Какой блок не проверяется в моем методе испытаний? (VS08 Test Framework) - PullRequest
1 голос
/ 01 июня 2010

У меня есть следующий код:

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?

1 Ответ

3 голосов
/ 01 июня 2010

вам нужно добавить секцию по умолчанию в ваш оператор 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);
}
...