Модульное тестирование - заглушка SqlDataReader

У нас есть n-уровневое веб-приложение, которое извлекает данные из SQL Server. Наша логика доступа к данным возвращает SqlDataReader, данные которого затем используются для создания наших бизнес-объектов (или объектов передачи данных).

Мы хотим создать модульные тесты для проверки нашего кода, который интерпретирует данные, возвращаемые этими объектами SqlDataReader, для построения наших бизнес-объектов.

Поэтому представляется необходимым создать заглушки для замены объектов SqlDataReader во время модульного тестирования. Как это, вероятно, довольно типично, наши объекты SqlDataReader обычно возвращают несколько наборов записей, каждый с несколькими строками.

  1. Это разумное усилие?
  2. Как мы должны строить эти заглушки?

Спасибо заранее

Griff

1 ответ

Решение

Автоматическое тестирование - это всегда разумное занятие:)

Ваш первый шаг, чтобы иметь возможность проверить это, - заставить вашу логику доступа к данным вернуть IDataReader вместо SqlDataReader - SqlDataReader инвентарь IDataReaderтак что никаких проблем нет.

В ваших модульных тестах вы можете вручную построить и заполнить DataTable объекты и вызов dataTable.CreateDataReader() чтобы получить IDataReader перейти в тестируемый объект.

редактировать

Чтобы предоставить вашим тестам набор образцов данных, я бы предложил использовать ObjectMother для каждой используемой вами таблицы данных, сохраняя создание таблиц данных в одном выделенном месте. Затем вы можете поставить методы на каждом ObjectMethod класс для обновления определенных данных строго типизированным способом. Например:

public class PersonalDetailsBuilder
{
    private DataTable _dataTable;

    public PersonalDetailsBuilder CreateNewTable()
    {
        this._dataTable = new DataTable("CustomerPersonalDetails")
        {
            Columns = new[]
            {
                new DataColumn("CustomerId", typeof(int)),
                new DataColumn("CustomerName", typeof(string))
            }
        };

        return this;
    }

    public PersonalDetailsBuilder AddStandardData(int numberOfRows = 3)
    {
        foreach (int i in Enumerable.Range(1, numberOfRows + 1))
        {
            this.AddRow(i, "Customer " + i);
        }

        return this;
    }

    public PersonalDetailsBuilder AddRow(int customerId, string customerName)
    {
        this._dataTable.Rows.Add(customerId, customerName);

        return this;
    }

    public IDataReader ToDataReader()
    {
        return this._dataTable.CreateDataReader();
    }
}

... который вы можете затем использовать, чтобы получить читатель данных:

IDataReader customerDetailsReader = new PersonalDetailsBuilder()
    .CreateNewTable()
    .AddStandardData()
    .AddRow(17, "Customer 17")
    .ToDataReader();
Другие вопросы по тегам