Заменить сервис программно во время выполнения в AngularJS
Я хочу заменить одну из служб, которую веб-приложение имеет во время выполнения, для целей тестирования. Существует служба, которая подключается к внешней службе, которая недоступна в некоторых локальных средах, и я хотел бы просто выполнить команду, чтобы заменить ее на макет.
Я видел, что могу получить любой сервис от AngularJS во время выполнения, позвонив:
> angular.element('html').injector().get('myService')
Но я хотел бы знать, есть ли способ заменить "myService" чем-то другим.
Я знаю, что создание myServiceWrapper, который предоставляет myService, позволит мне легко заменить его, выполнив:
> angular.element('html').injector().get('myServiceWrapper').myService = new Whatever();
Но я бы хотел избежать внесения изменений в приложение, которое уже работает.
1 ответ
У вас есть пара вариантов. Во-первых, вы можете просто объявить новый сервис с тем же именем (после того, как оригинальный сервис уже был объявлен). Поскольку в Angular в настоящее время нет концепции пространств имен, ваш новый сервис заменит старый.
Во-вторых, вы можете использовать декоратор для изменения частей сервиса.
Наконец, модуль ngMockE2E может также позволить вам заменить $httpBackend на фиктивный, чтобы использовать службу в том виде, в каком она существует в настоящее время, но блокировать любые звонки внешним поставщикам.