Заменить сервис программно во время выполнения в AngularJS

Я хочу заменить одну из служб, которую веб-приложение имеет во время выполнения, для целей тестирования. Существует служба, которая подключается к внешней службе, которая недоступна в некоторых локальных средах, и я хотел бы просто выполнить команду, чтобы заменить ее на макет.

Я видел, что могу получить любой сервис от AngularJS во время выполнения, позвонив:

> angular.element('html').injector().get('myService')

Но я хотел бы знать, есть ли способ заменить "myService" чем-то другим.

Я знаю, что создание myServiceWrapper, который предоставляет myService, позволит мне легко заменить его, выполнив:

> angular.element('html').injector().get('myServiceWrapper').myService = new Whatever();

Но я бы хотел избежать внесения изменений в приложение, которое уже работает.

1 ответ

У вас есть пара вариантов. Во-первых, вы можете просто объявить новый сервис с тем же именем (после того, как оригинальный сервис уже был объявлен). Поскольку в Angular в настоящее время нет концепции пространств имен, ваш новый сервис заменит старый.

Во-вторых, вы можете использовать декоратор для изменения частей сервиса.

Наконец, модуль ngMockE2E может также позволить вам заменить $httpBackend на фиктивный, чтобы использовать службу в том виде, в каком она существует в настоящее время, но блокировать любые звонки внешним поставщикам.

Другие вопросы по тегам