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

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

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

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

  • Является ли это разумным делом?
  • Как мы должны строить эти объекты-заглушки?

Большое спасибо заранее

Griff

Ответ 1

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

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

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

Edit

Чтобы предоставить ваши тесты набора данных образца, я бы предложил использовать 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();