В моем приложении есть Уровень доступа к данным, который оборачивает провайдер данных ADO.NET. DAL преобразует данные, возвращаемые поставщиком данных, в объекты .NET. Я видел много постов, в которых рекомендовалось не тестировать модуль DAL, но меня беспокоит, что так много может пойти не так - там много циклов, приведений и нулевых проверок.
У меня были некоторые мысли о создании фиктивного DbProvider с чем-то вроде RhinoMocks, но количество интерфейсов, которые я должен был бы макетировать в каждом тесте, было бы ошеломляющим, и количество ожиданий, которые я должен был бы установить, сделало бы тесты очень трудно читать. Кажется, что каждый тест был бы более сложным, чем код, который он тестировал - что было бы катастрофой с точки зрения 3 целей модульного тестирования:
- читаемость
- ремонтопригодность
- Достоверность
У меня была идея реализовать дружественный DbProviderFactory для загрузки образцов данных из xml. Я мог подключить его через Dependency Injection в тестах. Это должно значительно упростить ведение тестов. Тривиальный пример может быть:
[TestCase]
public void CanGetCustomer()
{
var expectedCommand = new XmlCommand("sp_get_customer");
expectedCommand.ExpectExecuteDataReader(
resultSet: @"<customer firstName=""Joe"" lastName=""Blogs"" ... />");
var factory = new XmlProviderFactory(expectedCommand);
var dal = new CustomerDal(factory);
Customer customer = dal.GetCustomer();
Assert.IsNotNull(customer, "The customer should never be null");
Assert.AreEqual(
"Joe", customer.FirstName,
"The customer had an unexpected FirstName.");
}
Я думаю, что этот подход - использование дружественного DbProvider - может упростить тестирование кода DAL. Это будет иметь следующие преимущества:
- Тестовые данные будут в формате xml и могут быть помещены в систему контроля версий вместе с модульными тестами. Это может быть во внешних файлах или в строках в тестах.
- Я не использую реальную базу данных, поэтому это устраняет проблему с состоянием. Поэтому мне не нужно переводить базу данных в известное состояние перед каждым тестом.
- Мне не нужно макетировать все интерфейсы ADO.NET в каждом тесте. Я напишу один набор фальшивых реализаций, которые я смогу повторно использовать по всей базе кода.
Могут ли люди дать некоторую критику по этой идее? Уже есть подобная реализация, которую я мог бы использовать для этого?
Спасибо