Nel caso in cui si desideri avere una versione a prova di prova del proprio provider, le cose diventano leggermente più complicate.
ecco il codice fornitore:
angular
.module('core.services')
.provider('storageService', [function() {
function isLocalStorageEnabled(window) {
return true;
}
this.$get = ['$window', 'chromeStorageService', 'html5StorageService',
function($window, chromeStorageService, html5StorageService) {
return isLocalStorageEnabled($window) ? html5StorageService : chromeStorageService;
}];
}]);
Il banco di prova:
describe('Storage.Provider', function() {
var chrome = {engine: 'chrome'};
var html5 = {engine: 'html5'};
var storageService, provider;
beforeEach(module('core.services'));
beforeEach(function() {
module(function (storageServiceProvider) {
provider = storageServiceProvider;
});
});
beforeEach(angular.mock.module(function($provide) {
$provide.value('html5StorageService', html5);
$provide.value('chromeStorageService', chrome);
}));
// the trick is here
beforeEach(inject(function($injector) {
storageService = $injector.invoke(provider.$get);
}));
it('should return Html5 storage service being run in a usual browser', function() {
expect(storageService).toBe(html5);
});
});
In questo caso $ get è un array e non si può semplicemente chiamare come al solito una funzione che fornisce le dipendenze come argomenti. La soluzione è utilizzare $ injector.invoke().
Questo è strano che la maggior parte dei tutorial e dei campioni manca questo dettaglio.
Come funziona senza chiamate per "iniettare"? Ho scoperto che dovevo seguire la chiamata 'module()' con 'inject()' – Merott
L'iniettore avvolge il test (nella dichiarazione it (...)) –
"La prova è nel Plunker" Non ha funzionato lavoro, ma ha gettato molti errori di dipendenza. – LeeGee