Мини-провайдер для инъекций с жасмином и угловым

У нас есть проект (угловой) и несколько юнит-тестов для него (жасмин + синон), который при минимизации создает некоторые проблемы. Для реального кода мы решили эти проблемы путем внедрения с использованием статически типизированного массива строк, например, ['locationService', 'etcService']. К сожалению для юнит-тестов, у минификации есть еще несколько проблем, которые нужно решить. В качестве примера:

module(function($provide){
    $provide.service('etc..',...);
}

Приведенный выше код сразу становится непригодным для использования, поскольку переменная провайдера переименовывается во что-то вроде "a". Я попытался немного подправить функцию, обернув что-то вроде ниже:

function injectTest($provide){
    // do the same stuff
}
injectTest.$inject = ['$provide'];

который был рекомендуемым решением в некоторых других сообщениях онлайн. Проблема с модулями, это действительно не работает. Я пробовал оба:

module(angular.injector().invoke(injectTest)); // which results in 'Unknown provider: $provideProvider <- $provide

а также

module(injectTest); // which results in 'Unknown provider: nProvider <- n'

Есть ли способ ввести $ провайдера в модуль, не прерывая минификацию?

1 ответ

Встроенная инъекция:

var myFN = ['$provide', function($provide){
   // do stuff
}]

Теперь, если вы хотите привязать функцию к сторонней библиотеке, где вам нужен сервис, скажем, в моем примере вашей функции нужен сервис CRUDService и получить объекты params от стороннего производителя:

var myFN = ['CRUDService', function(CRUDService){
   // do some init stuff
   // you can either make it a singleton by sotrng the function and return the reference or either return new function on each call
   return function(params){
       // do stuff
   };
}] ;

// now to bind it to your 3rd party
objectFor3rdParty = {fn:$injector.invoke(myFN)};

Я использую только встроенную инъекцию вместо $inject, я думаю, это вопрос вкуса.

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