Не уверен, как протестировать строку кода на C#

#c# #unit-testing #testing

#c# #модульное тестирование #тестирование

Вопрос:

Мне приходится тестировать команду throw после if (команды[0] == ‘(‘)). Я думаю, что если statment if означает, что если первый символ в command не соответствует) выдает ошибку. Я пробовал несколько статусов без a ), но до сих пор не смог выполнить команду throw . Есть идеи.

 private double ParseTerm(ref string command)
    {
        double returnValue=0;
        if (command.Length != 0)
        {
         if (command[0] == '('))
            {
                command = command.Substring(1,command.Length -1);   // skip the open paren
                returnValue= ParseExpr(ref command);
                if (command[0] != ')')                              // make sure there is a close paren for each open parenthesis
                    throw new System.FormatException();
                command = command.Substring(1,command.Length -1);   // skip the close paren
            } 
        return returnValue;
    }
  

Вот ParseExpr

 private double ParseExpr(ref string command)
    {
        double op, op2;

        if (command == "")                              // Handle the empty expression case
            return 0;

        op = ParseFactor(ref command);                  // parse left side of expression

        if (command != "")                              // if a right side exists, parse it
        {               

            if (command[0] == ' ')                      // test for ' '
            {           
                command = command.Substring(1,command.Length -1);   // skip to  

                if (command.Length == 0)    
                    throw new System.FormatException();     // no right hand side operator

                op2 = ParseExpr(ref command);               // parse remainder of the expression
                op  =  op2;
            } 
            else if (command[0] == '-')
            {                   
                command = command.Substring(1,command.Length -1);
                if (command.Length == 0)
                    throw new System.FormatException();
                op2 = ParseExpr(ref command);           
                op -=  op2;
            } 
        }
        return op;
    }


    private double ParseFactor(ref string command)
    {
        double op, op2;
        op = ParseExp(ref command);
        if (command != "")
        {               
            if (command[0] == '*')
            {                   
                command = command.Substring(1,command.Length -1);
                if (command.Length == 0)
                    throw new System.FormatException();
                op2 = ParseFactor(ref command);         
                op *=  op2;
            } 
            else if (command[0] == '/' || command[0] == '\')
            {                   
                command = command.Substring(1,command.Length -1);
                if (command.Length == 0)
                    throw new System.FormatException();
                op2 = ParseFactor(ref command);     

                if (op2 == 0)                                   // don't allow divide 0
                    throw new System.DivideByZeroException();   // the division operation won't return
                op /=  op2;                                     // throw the exception since we are using doubles
            }               
            else if (command[0] == '%')
            {                   
                command = command.Substring(1,command.Length -1);
                if (command.Length == 0)
                    throw new System.FormatException();
                op2 = ParseFactor(ref command);                             
                op = (int)op % (int)op2;
            } 
        }
        return op;
    }
  

Комментарии:

1. Можете ли вы показать метод ParseExpr?

2. Это зависит от того, что ParseExpr() делает…

3. ParseFactor() Изменяет ли command ?

4. Вам нужно пошагово выполнить свою программу в отладчике. Следуйте каждому заявлению, чтобы вы могли проверить, что происходит, и сравнить это с вашими ожиданиями. Когда вы доберетесь до строки кода, которая не вызывает исключение FormatException, когда вы ожидаете этого, вы сможете легко указать, почему. Ключ в том, чтобы пошагово выполнять код, следовать за ним по мере его выполнения.

5. Я не думаю, что ParseFactor() изменяет команду на то, что я пытаюсь сделать, но я все равно публикую ее

Ответ №1:

Вы имеете в виду UnitTest? Если да:

 [TestMethod]
[ExpectedException(typeof(FormatException))]
public void ParseTerm_when_the_last_char_is_not_a_close_parenthesis_should_throw_FormatException()
{
    //Call the method here:
    ParseTerm("(some string without close parenthesis");
}