Что лучше использовать для фейковых запросов на сервер?
Есть большое single page app. На фронтенде ангуляр. Разработка новых фич начинается с прототипа в котором определяется интерфейс запроса на сервер. Т.к. на момент разработки новой фичи сервера ещё нет, то в качестве фейкового ответа используем запросы на заготовленный json. Я предложил ребятам перейти на мок $httpBackend чтобы запросы писать реальные и когда бэкенд будет готов просто выключать фейк. Сеньор не соглашается говорит, что больше возни. Теперь сижу и думаю: если дело было бы в этом, то зачем тогда вообще мок использовать?
$httpBackend используется в юнит тестах, вот и все. Не в E2E (хотя иногда и там) даже, только в юнит тестах. На то он и мок.
Я обычно делаю для проекта свою обертку над $http чисто под свои нужды. То есть я стараюсь в принципе не работать напрямую с $http, много проблем если используется несколько API. А уже на уровне сервиса можно стабить данные. Просто заресолвленный промис с данными всегда возвращать. Ну и в любом случае сохранение/загрузка данных из API должна быть вынесена в сервис какой-то.
Не нормальное решение с моком потому что придется ожидания для всех запросов прописывать, учитывая последовательность оных, а можно просто стабить данные в сервисе.
Для начала давайте определимся, есть 2 реализации $httpBackend. Одна относится к ngMock а вторая к ngMockE2E. Первая используется для юнит тестов а вторая для E2E тестов.
Начнем с того что обе реализации должны использоваться только для тестов. То есть если вы ведете разработку через тестирование то все ок. Но если вы захотите проверить результат в браузере без апишки у вас всеравно ничего не будет работать. Можно эту проблему решить застабив данные на уровне какого-нибудь прокси сервера на node.js Если вы используете gulp то подобное можно сделать при помощи gulp-webserver (для grunt тоже есть что-то подобное наверное) довольно легко, сделав внутри проверку, что мол если у нас такой-то запрос туда-то то мы вернем тупо свой ответ, а если нет - отправим дальше на бэкэнд. В этом случае мы можем использовать реальный API и стабить только отсутствующие методы.
Александр Марченко: еще нужно отметить что сервис $http является низкоуровневым и у вас по хорошему должна быть какая-то обертка над ним для своей API. При покрытии оной тестами мы можем при помощи $httpBackend входящей в ngMock проверять точно ли он конструирует запросы, как реагирует на ответы и т.д. При покрытии юнит тестами других ваших сервисов, мы мокаем уже наш сервис прослойку, нашу высокоуровневую обертку.
При e2e и реализации из ngMockE2E уже можно описывать именно реализацию сервера, это тупо стаб. Там нет разницы в каком порядке вы что вызываете.