2016-06-06 6 views
1

Сегодня я столкнулся с проблемой: я пытался проверить ошибки программного обеспечения, чтобы обеспечить правильное поведение программы при ее возникновении в ошибке.Могу ли я динамически проверять регистр case в C#?

Мне нужно было проверить, существует ли пользователь в базе данных.

Проблема в том, что фоновый код не предоставляет errorId, поэтому я должен проверить ошибки по тексту.

Ошибки отображаются следующим образом:

Пользователь Имя уже есть!

Заявление переключателя заключается в следующем:

switch (error.text) 
{ 
    case "User Test already exists": 
    Console.WriteLine("The user already Exists"); //this is a test behaviour. 
    break; 
    default: 
    Console.WriteLine("I couldn't behave in any way :<"); 
} 

Как вы можете себе представить, что имена всех разные (это единственное поле в БД), так что слово «тест» в случае заявления должны быть имя пользователя.

Могу ли я динамически изменять строку?

+3

* Пожалуйста, * форматируйте свой код как код, а не добавляйте жирным шрифтом и курсивом по всему месту (в HTML не менее). Но нет, случаи должны составлять константы времени компиляции. Похоже, вы могли бы просто использовать инструкцию 'if' очень легко, хотя ... –

+0

Это будет очень хрупкий тест. Вы должны делать только этот тип теста, если ничего другого нет. Например, вы не могли добавить уникальный идентификатор или что-то в бэкэнд? –

+0

Зачем делать ошибки настолько конкретными? Ваша ошибка: «Пользователь уже существует», затем для регистрации или отображения вы можете зарегистрировать имя пользователя, которое было предпринято. –

ответ

1

Кажется, что Regex сделал бы трюк. Я построил этот Regex на основе от шаблона:

The user Name already Exists! 

где Name может быть любое значение. Regex является:

(the user .* already exists) 

Чтобы использовать его, вы будете делать что-то вроде этого:

Regex.IsMatch(error.text, "(the user .* already exists)", RegexOptions.IgnoreCase) 

Какой бы возвращать true или false на основе соответствия. Теперь это не может быть сделано в коммутаторе, но вы можете просто запустить значение через ряд регулярных выражений, чтобы определить, с чем оно соответствовало. Одна вещь, которую вы можете рассмотреть, - это метод расширения. Рассмотрим это один:

public static class RegexExtensions 
{ 
    private static readonly Regex UserNameAlreadyExists = new Regex("(the user .* already exists)", RegexOptions.IgnoreCase | RegexOptions.Compiled); 

    public static bool IsUserNameAlreadyExists(this string inputValue) 
    { 
     return UserNameAlreadyExists.IsMatch(inputValue); 
    } 
} 

Использование для этого было бы очень приятно:

if (error.text.IsUserNameAlreadyExists()) 
{ 
    // do something 
} 

Метод расширения это действительно хороший способ работать через него. Он полностью инкапсулирован и сохранит чистоту использования. Кроме того, легче определить Regex в одном месте и, таким образом, установить его на Compiled, делая его быстрее.

+0

Хорошо. Конечно, в поле 'Regex'' RegexExtensions' отсутствует 'static'. –

+0

Да, спасибо @JeppeStigNielsen –

-1

для верности: на внутреннем сервере не указан какой-либо errorID? Если вы используете C# для подключения к базе данных (т. Е. ADO.Net), у вас есть возможности для эффективной обработки ошибок.

Можно ли просто проверить, нет ли error.text или нет?

if(error.text=="")Console.WriteLine("The User already exists"); 
else Console.WriteLine("I couldn't behave in any way"); 

Если вы хотите, чтобы проверить, есть ли дубликаты в столбце «пользователь» вы можете проверить базу данных непосредственно с помощью SQL.

0

Предпочтительно изменить внутренний интерфейс или изменить его (он определенно должен возвращать какой-то код ошибки вместо уже локализованного сообщения, явно предназначенного для показа пользователю - это явно задача переднего плана).

Чтобы ответить на вопрос, нет; рассмотреть возможность использования что-то вроде этого вместо (оригинал фразировки, имейте в виду, что эти сравнения строк чувствительны к регистру):

if(error.text.StartsWith("User ") && error.text.EndsWith(" already Exists")) 
{ 
    Console.WriteLine("The user already Exists"); //this is a test behaviour. 
} 
else 
{ 
    Console.WriteLine("I couldn't behave in any way :<"); 
} 
0

Я полагаю, что это будет довольно простое решение:

class Program 
{ 

    int errorIndex = 5; //Based on error expected text. Can add more criteria here. 

    private static bool testResponse = false; 

    static void Main(string[] args) 
    { 
     string text = "The user already exists"; 


     getErrorMessage(text); 

    } 


    private static void getErrorMessage(string message) 
    { 

     var user = message.Substring(4, 4); 
     var exists = message.Substring(17, 6); 
     if (user == "user" && exists == "exists") 
      //Write the error message. 
      Console.WriteLine(message.ToString()); 
      var errorMessage = message; 
      if (errorMessage != null) 
      { 
       testResponse = true; 
      } 
      Console.ReadLine(); 



    } 
} 

Это если вы знаете, точное местоположение длины и индекса некоторых слов сообщения об ошибке. Вы можете использовать эту информацию для дальнейшего сужения ожидаемых ошибок. Это предполагает, что нет errorId.

Смежные вопросы