Общее·количество·просмотров·страницы

четверг, 1 сентября 2011 г.

Тестирование исключений.

Для тестирования исключений можно использовать вот такой класс. Позволяет проверить
не только выброс исключения, но и сообщение которое оно содержит.


Code Snippet
  1. /// <summary>
  2.     /// Проверяет выброшенное исключение
  3.     /// </summary>
  4.     public static class ExceptionAssert{
  5.         private const string NotException="Исключение не выброшено.";
  6.         private const string NotTypeexception="Выброшено исключение не того типа. Тип: ";
  7.         private const string NotMessage="Исключение не содержит указанное сообщение. Сообщение: ";
  8.  
  9.         /// <summary>
  10.         /// Проверяет выброс исключения заданного типа
  11.         /// </summary>
  12.         /// <typeparam name="T">Тип исключения</typeparam>
  13.         /// <param name="action">Делегат для проверки</param>
  14.         /// <exception cref="ArgumentNullException"></exception>
  15.         /// <exception cref="AssertFailedException"></exception>
  16.         public static void Validate<T>(Action action) where T:Exception{
  17.             if(action==null)
  18.                 throw new ArgumentNullException("action");
  19.             ValidateExitAndType<T>(action);
  20.         }
  21.  
  22.         /// <summary>
  23.         /// Проверяет выброс исключения заданного типа
  24.         /// и наличия в нём указанного сообщения
  25.         /// </summary>
  26.         /// <typeparam name="T">Тип исключения</typeparam>
  27.         /// <param name="action">Делегат</param>
  28.         /// <param name="message">Сообщение</param>
  29.         /// <exception cref="ArgumentNullException"></exception>
  30.         /// <exception cref="AssertFailedException"></exception>
  31.         public static void Validate<T>(Action action,string message) where T:Exception{
  32.             if(action==null)
  33.                 throw new ArgumentNullException("action");
  34.             if(message==null)
  35.                 throw new ArgumentNullException("message");
  36.             var exception=ValidateExitAndType<T>(action);
  37.             if(exception.Message!=message)
  38.                 throw new AssertFailedException(NotMessage+exception.Message);
  39.         }
  40.  
  41.         //проверяет выброс и тип исключения
  42.         private static Exception ValidateExitAndType<T>(Action action) where T:Exception{
  43.             var exception=GetException(action);
  44.             ValidateException<T>(exception);
  45.             return exception;
  46.         }
  47.  
  48.         //получает ислючение выброшенное в делегате
  49.         private static Exception GetException(Action action){
  50.             try{
  51.                 action();
  52.             } catch(Exception e){
  53.                 return e;
  54.             }
  55.             return null;
  56.         }
  57.  
  58.         //проверяет наличие и тип исключения
  59.         private static void ValidateException<T>(Exception exception) where T:Exception{
  60.             if(exception==null)
  61.                 throw new AssertFailedException(NotException);
  62.             if(!(exception is T))
  63.                 throw new AssertFailedException(NotTypeexception+exception.GetType());
  64.         }
  65.     }