Мы только что выпустили переписанный (в третий раз) модуль для нашей проприетарной системы. Этот модуль, который мы называем менеджером нагрузки, на сегодняшний день является самым сложным из всех модулей в нашей системе. Мы пытаемся получить комплексный набор тестов, потому что каждый раз, когда мы вносим какие-либо существенные изменения в этот модуль, приходится чертовски платить за то, чтобы разобраться в ошибках и причудах. Однако разработка набора тестов оказалась довольно сложной, поэтому мы ищем идеи.
Внутренности менеджера загрузки находятся в классе LoadManagerHandler, по сути, это вся логика, лежащая в основе модуля. Этот обработчик вызывает несколько контроллеров для выполнения методов CRUD в базе данных. Эти контроллеры по сути являются верхним уровнем DAL, который расположен сверху и абстрагирует наш сгенерированный LLBLGen-код.
Так что достаточно просто смоделировать эти контроллеры, что мы делаем с помощью инфраструктуры Moq. Однако проблема заключается в сложности диспетчера загрузки, и проблемы, которые мы получаем, связаны не с простыми случаями, а с случаями, когда в обработчике содержится значительное количество данных.
Для краткого объяснения менеджер загрузки содержит ряд «выгруженных» деталей, иногда сотнями, которые затем сбрасываются в созданные пользователем нагрузки и пулы повторных загрузок. В процессе создания и заполнения этих загрузок происходит множество удалений, изменений и дополнений, которые в конечном итоге вызывают проблемы. Однако, потому что, когда вы макете метод объекта, побеждает последний макет, то есть:
jobDetailControllerMock.Setup(mock => mock.GetById(1)).Returns(jobDetail1);
jobDetailControllerMock.Setup(mock => mock.GetById(2)).Returns(jobDetail2);
jobDetailControllerMock.Setup(mock => mock.GetById(3)).Returns(jobDetail3);
Независимо от того, что я отправляю на jobDetailController.GetById (x), я всегда буду возвращать jobDetail3. Это делает тестирование практически невозможным, потому что мы должны убедиться, что при внесении изменений затрагиваются все точки, которые должны быть затронуты.
Итак, я решил использовать тестовую базу данных и просто разрешить чтение и запись как обычно. Однако, поскольку вы не можете (читай: не должны) определять порядок ваших тестов, тесты, которые выполняются раньше, могут привести к сбою тестов, которые выполняются позже.
TL / DR: я в основном ищу стратегии тестирования для ориентированного на данные кода, который довольно сложен по своей природе.