Мини-провайдер для инъекций с жасмином и угловым
У нас есть проект (угловой) и несколько юнит-тестов для него (жасмин + синон), который при минимизации создает некоторые проблемы. Для реального кода мы решили эти проблемы путем внедрения с использованием статически типизированного массива строк, например, ['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, я думаю, это вопрос вкуса.