Модульное тестирование - заглушка SqlDataReader
У нас есть n-уровневое веб-приложение, которое извлекает данные из SQL Server. Наша логика доступа к данным возвращает SqlDataReader, данные которого затем используются для создания наших бизнес-объектов (или объектов передачи данных).
Мы хотим создать модульные тесты для проверки нашего кода, который интерпретирует данные, возвращаемые этими объектами SqlDataReader, для построения наших бизнес-объектов.
Поэтому представляется необходимым создать заглушки для замены объектов SqlDataReader во время модульного тестирования. Как это, вероятно, довольно типично, наши объекты SqlDataReader обычно возвращают несколько наборов записей, каждый с несколькими строками.
- Это разумное усилие?
- Как мы должны строить эти заглушки?
Спасибо заранее
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();