Давайте начнем с того, что поставим под сомнение ваше предположение «Невозможно имитировать логику ни в одной из этих систем».
Конечно, вы можете имитировать поведение, если используете правильные инструменты. Ваша система взаимодействует с базой данных посредством объекта базы данных; Ваша система должна взаимодействовать с веб-службой через объект веб-службы. Любой из этих объектов или оба из них могут быть смоделированы посредством использования соответствующей среды для имитации. Для любого вызова модульного теста для объекта базы данных вы создаете макет для этого объекта, устанавливаете его ожидания и результат для вызова, а затем передаете макет своему тестируемому коду (CUT) вместо «реального» объекта базы данных. Ваш код вызывает макет, который затем сравнивает свои аргументы с заранее установленными ожиданиями и возвращает ожидаемый результат (вместо фактического взаимодействия с базой данных). Ваш код затем воздействует на результат. Если аргументы метода не соответствуют ожиданиям, фиктивный объект выдаст исключение.
Вы можете прочитать статьи о фиктивных объектах и модульном тестировании для .Net здесь:
Имейте в виду, такие инструменты, как NMock и Typemock облегчают работу, но это все еще сложно - вам нужно спроектировать код для тестирования, а не просто сначала написать код и молитесь, чтобы вы могли проверить это позже.
Возможно, вы захотите поговорить с вашим поставщиком веб-услуг - каждый сторонний веб-сервис, с которым я когда-либо взаимодействовал, кроме простых запросов, имел тестовый режим (вы используете тестовые учетные данные и тестовый сервер вместо действующего сервера) , Любые транзакции на тестовом сервере очищаются в конце дня. Если они не предлагают тестовую услугу И , то их услуга включает в себя не только простые запросы, тогда я настоятельно рекомендую найти другого поставщика услуг.
Существует еще одна стратегия, которую вы можете использовать для работы с базой данных при определенных обстоятельствах: использовать транзакции. Когда вы открываете соединение с базой данных во время модульного теста, открывайте транзакцию. В конце каждого юнит-теста откатывайте транзакцию. Это простая идея, но дьявол кроется в деталях, и будет хаос, если вы облажаетесь и случайно совершаете транзакцию. Я не рекомендую, но я работал в течение 2 лет над одним проектом.