Как я могу написать автоматизированный тест для обработки исключений - PullRequest
1 голос
/ 26 октября 2011

У меня много кода следующего типа (каждый получает данные из разных таблиц).

public class TableOneDAO
{
    public TableOneDAO(IDbConnection dbConnection)
    {
        _dbConnection = dbConnection;
        _log = LogFacade.GetLog();
        _tableOneRowMapper = new TableOneRowMapper();
    }

    public IList<TableOneRecord> FindAll()
    {
        try
        {
            using (IDbCommand cmd = _dbConnection.CreateCommand())
            {
                cmd.CommandText = TableOneSql.FindAllSql();

                return _tableOneRowMapper.GetObjectList(cmd.ExecuteReader());
            }
        }
        catch (Exception exception)
        {
            _log.Error(exception.Message, exception);

            throw;
        }
    }

    private readonly IDbConnection _dbConnection;
    private readonly TableOneRowMapper_tableOneRowMapper;
    private readonly ILog _log;
}

_tableOneRowMapper.GetObjectList (cmd.ExecuteReader ()) получает данные из базы данных и сопоставляетэто в список.У нас были прошлые проблемы с записями, вызывающими проблемы в отображении, и теперь мы хотим сразу их зарегистрировать, а затем отправить их вызывающему приложению.У меня есть тесты для всего, кроме обработки исключений.Я должен поддерживать обработку исключений общего характера.

Я использую или имею следующие доступные для использования:

  • .Net 3.5
  • VS 2008
  • NUnit 2.5.10.11092
  • Rhino Mocks 3.6

МОИ ВОПРОСЫ:

  • Как создать автоматические тесты (единица или интеграция) для обработки исключений?
  • Нужно ли вводить TableOneRowMapper и макетировать его, чтобы оно вызывало исключение при вызове?
  • Есть ли другие способы сделать это без внедрения?
  • Не беспокойтесь о тестировании обработки исключений?

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

?Как создать автоматические тесты (единичные или интеграционные) для обработки исключений?

// ensure that a given code block throws specific exception
Assert.Throws<ExceptionType>(() => { code block to execute });

// ensure that a given code block DOES NOT throw specific exception
Assert.DoesNotThrow(() => { code block to execute });

?Нужно ли вводить TableOneRowMapper и макетировать его, чтобы он вызывал исключение при вызове?

  • Unti test - да, поскольку это зависимость, вы должны внедрить его
  • Интеграционный тест - нет

?Есть ли другие способы сделать это без введения?

Нет, иначе это будет интеграционный тест, а не юнит-тест

?Не беспокойтесь о тестировании обработки исключений?

???

1 голос
/ 26 октября 2011

• Как создать автоматические тесты (единицы или интеграции) для обработки исключений?

NUnit имеет атрибут ExpectedException (http://www.nunit.org/index.php?p=exception&r=2.4), который подтверждает, что было сгенерировано исключение.

Вы также захотите убедиться, что исключение было зарегистрировано. Может ли LogFacade.GetLog () вернуть фиктивный журнал?

• Существуют ли другие способы сделать это без внедрения?

Этозависит от вашего определения 'инъекция' .

В общем смысле инъекции - используя что-то, не созданное в классе - вам do необходимо ввести маппер,в противном случае, как говорит @sll, это не модульный тест.

Если вы беспокоитесь об изменении ctor для TableOneDAO, вы можете использовать фабрику для создания картографа вместо создания его в DAO.Вы можете зарегистрировать макет макета на заводе.

Другое

Если вы собираетесь делать это много (создание и тестирование большого количества таблиц DAO), ясоздаст базовый класс TableDAO и выведет из него все остальные.Производные классы должны предоставлять только строку mapper и sql.

При этом способе обработки исключений требуется только один раз протестировать модуль;для базового класса.

hth,

Alan.

...