#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");
}