Ich habe einen eckigen Service verantwortlich für das Laden einer config.json Datei. Ich möchte es in meiner Run-Phase nennen, also setze ich dieses JSON in meinem $ rootContext und daher ist es in Zukunft für alle verfügbar.
Im Grunde ist das, was ich habe:
angular.module('app.core', []).run(function(CoreRun) {
CoreRun.run();
});
Wo ist mein CoreRun Service ist:
angular.module('app.core').factory('CoreRun', CoreRun);
CoreRun.$inject = ['$rootScope', 'config'];
function CoreRun($rootScope, config) {
function run() {
config.load().then(function(response) {
$rootScope.config = response.data;
});
}
return {
run: run
};
}
Dies funktioniert gut, und das Problem aufkommt, wenn ich zu Test versuchen es . Ich möchte meinen Config-Dienst ausspionieren, damit er ein falsches Versprechen zurückgibt. Allerdings kann ich es nicht machen, da während der Konfigurationsphase für meinen Test keine Dienste verfügbar sind und ich $ q nicht injizieren kann.
Soweit ich sehen kann, gibt es die einzige Chance, meinen Config-Dienst zu verspotten, in der Config-Phase, da es von run block aufgerufen wird.
Der einzige Weg, den ich bis jetzt gefunden habe, ist die Generierung des Versprechens mit jQuery, das ich wirklich nicht mag.
beforeEach(module('app.core'));
var configSample;
beforeEach(module(function ($provide) {
config = jasmine.createSpyObj('config', [ 'load' ]);
config.load.and.callFake(function() {
configSample = { baseUrl: 'someurl' };
return jQuery.Deferred().resolve({data: configSample}).promise();
});
provide.value('config', config);
}));
it('Should load configuration using the correspond service', function() {
// assert
expect(config.load).toHaveBeenCalled();
expect($rootScope.config).toBe(configSample);
});
Gibt es eine Möglichkeit, eine bessere Problemumgehung zu machen?
BEARBEITEN Sie: Wahrscheinlich lohnt es sich zu bemerken, dass dies ein Problem ist, nur wenn Unit-Test mein Lauf blockieren.
mögliche Duplikate von [Can $ q und $ http im Abschnitt .config injiziert werden] (http://stackoverflow.com/questions/20626514/can-q-and-http-be-injected) -in-the-config-section) – Constantine
Scheint ähnlich, aber komplett anders. Die eine, die Sie beziehen, ist über die Injektion von $ q in der Config-Phase eines realen Moduls. Hier geht es darum, $ q in einen Run-Block während der Config-Phase eines Unit-Tests zu injizieren, damit Sie sich darüber lustig machen können, dass Sie Ihren Run-Block testen können. – jbernal