2016-03-24 5 views
1

Ich bin neu in Angular und ich bin mir nicht ganz sicher, wie genau die Abhängigkeitsinjektion funktioniert. Mein Problem ist, dass ich Service A habe, der von Service B abhängt, aber wenn ich Service A in meinen Test injiziere, wird Service B undefiniert.Injected Dependency ist nicht definiert in Unit Test

Ich habe Injecting dependent services when unit testing AngularJS services gesehen, aber dieses Problem ist ein bisschen anders als meins. Diese Injected Dependencies become undefined in angular service ist meinem Problem sehr ähnlich, aber ich konnte das JS nicht übersetzen.

Ich habe auch meine Variablennamen geändert und vereinfacht den Code, um irrelevante Zeilen zu entfernen.

Service.ts

export class ServiceA { 
    constructor(private $resource: ng.resource.IResourceService, private ServiceBInstance: ServiceB){ 
    } 

    ServiceAMethod() { 
     var resources = ServiceBInstance.property; //ServiceBInstance is undefined here 
    } 
} 

factory.$inject = [ 
    '$resource' 
    'ServiceBModule' 
]; 
function factory($resource: ng.resource.IResourceService, ServiceBInstance: ServiceB): IServiceA { 
    return new ServiceA($resource, ServiceBInstance); 
} 

angular 
    .module('ServiceAModule') 
    .factory('ServiceA', 
    factory); 

Spec.ts

describe('ServiceB',(): void => { 

    beforeEach((): void => { 
     angular.mock.module(
      'ServiceAModule', 
      'ServiceBmodule', 
      'ngResource' 
     ); 
    }); 

    describe('ServiceAMethod',(): void => { 

     it("should...", inject(
      ['ServiceA', (ServiceAInstance: ServiceA): void => { 
       ServiceAInstance.ServiceAMethod(); //Problem Here 
      }])); 
    }); 

});

Das Problem, das ich habe ist, dass, wenn ich ServiceAMethod aufrufen, bekomme ich einen Fehler, der "TypeError: Eigenschaft Eigenschaft 'von undefined" nicht lesen kann. Das Seltsame ist, dass $ resource niemals undefiniert ist, aber mein ServiceB ist immer undefiniert.

Ich dachte, wenn ich ServiceA in meinen Test injiziere, sollte es automatisch auch alle seine Abhängigkeiten injizieren.

Beachten Sie auch, dass ich ServiceB absichtlich nicht spotte.

aktualisieren

Ich habe auch eine Instanz meiner ServiceB in die es zu injizieren versucht, aber wenn ich die Variable heißt es auch ausdrucken, dass es nicht definiert ist, und wenn ich versuche zu tun der Code unten in den before

inject(function (_ServiceBInstance_: ServiceB) { 
     console.log(_ServiceBInstance_); 
    }); 

ich und Unknown Provider Fehler.

Antwort

0

Ok, also nach Stunden der Suche fand ich endlich die Antwort. Ich habe vergessen, eine Datei enthalten, die Angular der .config-Methode einbezogen

, wenn der Anbieter die Schaffung sicherstellen, dass Sie rufen .config auch, hier ein Beispiel:

angular 
    .module('ServiceBModule') 
    .config(['ServiceBProvider', (ServiceBClass) => { //Very Important 
     //Code here 
    }]) 
    .provider('ServiceB', ServiceB);