В настоящее время я работаю над системой, которая выполняет довольно много функций в стиле отчетности, которые потребляют много разных точек данных и преобразуют их в более крупные, иногда сглаженные выходные данные. Большая часть моего приложения построена на вариации шаблона репозитория. В связи с этим у меня есть набор репозиториев, которые я использую для тестирования сценариев. Проблема, с которой я сталкиваюсь, состоит в том, что взаимодействие между этими точками данных настолько сложное, что быстро становится кошмаром обслуживания для поддержки «фиктивных данных». Вот пример из примера:
public class SomeReportingEntity
{
private IProductRepo ProductRepo;
private IManagerRepo ManagerRepo;
private ILocationRepo LocationRepo;
private IOrdersService OrdersService;
private IEmployeeRepo EmployeeRepo;
public ReportingEntity(IProductRepo ipr, IManagerRepo imr, ILocationRepo ilr, IOrdersService ios,
IEmployeeRepo ier){
//Load these to private vars...
}
//This is the function that I want to test...
public SomeReportingEntity GetManagerSalesByRegionReport()
{
//Make a complex join on all sub collections. These
//sub collections are all under test individually.
var MangerSalesByRegionItems = From x in ProductRepo.CurrentProducts()
Join y in OrdersService.FutureOrders() On ...
Join z in EmployeeRepo.ActiveEmployees() On ...
Join a in LocationRepo.GetAllRegions() On ...
Join b In ManagerRepo.GetActiveManagers On ...
Select new SomeReportingEntity() With { ... }
return MangerSalesByRegionItems.ToList();
}
}
По общему признанию, это очень надуманный пример, но основная идея, на которой я хочу подчеркнуть, состоит в том, что у меня есть несколько репозиториев, к которым я присоединяюсь, и мне нужно создать много тестов, чтобы гарантировать, что этот сложный запрос будет работать, как ожидалось. Из-за того, что операции объединения являются настолько сложными, это делает ОЧЕНЬ трудно поддерживать согласованные данные - тем более, что мне нужно добавить больше ассоциаций и проверить дополнительные точки. Кроме того, мне нужно иметь возможность вводить конкретные состояния записи в макеты (например, у сотрудника, у которого нет назначенного менеджера), чтобы убедиться, что запрос обрабатывает эти ситуации соответствующим образом.
Итак, вот мои вопросы:
- Каков наилучший способ «высмеивать» эти данные, чтобы они не были таким кошмаром по вопросам материнства? У меня было много людей, предлагающих создать базу данных в памяти, чтобы поддержать это.
- Я действительно страдаю от проблемы архитектуры здесь? В сценариях отчетности я довольно часто оказываюсь в этом паттерне, где беру много разрозненных точек данных и объединяю их в новый гибридный объект. С появлением Linq это очень легко сделать, и у него высокая ясность намерений, но иногда кажется, что я немного изменяю.