2017-03-20 1 views
0

Supposons que je classe Foo qui fournit des services injectés de dépendance à toutes ses classes dérivées, comme tel:Unité test d'une classe parente qui utilise Injector avec routeur (et d'autres services)

export class Foo { 
    protected fb : FormBuilder; 
    protected router : Router; 
    protected otherService : OtherService; 
    protected anotherService : AnotherService; 

    constructor(injector : Injector) { 
     this.fb = injector.get(FormBuilder); 
     this.router = injector.get(Router); 
     this.otherService = injector.get(OtherService); 
     this.anotherService = injector.get(AnotherService); 
} 

qui a des classes dérivées de celui-ci en tant que tel:

export class Bar extends Foo { 

    constructor(injector : Injector){ 
     super(injector); 
    } 
} 

Comment puis-je tester correctement l'unité de la classe parente, sans courir dans:

Error: Can't resolve all parameters for Foo: (?)

A la minute où je l'ai (avoir essayé beaucoup, beaucoup choses différentes pour le faire fonctionner, mais à défaut :()

export function main() { 

    describe('Class: Foo',() => { 
     beforeEach(async(() => { 

      TestBed.configureTestingModule({ 
       providers: [ 
        Foo, 
        Injector, 
        OtherService, 
        AnotherService 
       ] 
      }); 
     })); 


     it('should compile', inject([Foo, Injector], (foo: Foo, injector : Injector) => { 
      console.log("INJECTOR", injector); 
      expect(foo).toBeTruthy(); 
     })); 

    }); 
} 

J'ai aussi essayé d'utiliser ReflectiveInjector.resolveAndCreate comme tel:

{ 
    provide : Injector, 
    useValue: ReflectiveInjector.resolveAndCreate([FormBuilder, Router, OtherService, AnotherService]) 
} 

Mais toujours pas de dés :(Des idées?

+0

'Injector: injector' est-il typo? Je suppose que vous voulez écrire 'injector: Injector' – yurzui

+0

Ouais, c'était une faute de frappe .... mis à jour :) – Nunicorn

Répondre

2

Semble vous devez ajouter @Inject décorateur pour Injector dans Foo constructeur

constructor(@Inject(Injector) injector: Injector) { 

et configurer TestBed correctement. Plus précisément, vous devez importer RouterModule sinon vous obtiendrez un autre problème avec Router:

TestBed.configureTestingModule({ 
    imports: [ 
    RouterModule.forRoot([]) 
    ], 
    providers: [  
    FormBuilder, 
    Foo, 
    OtherService, 
    AnotherService 
    ] 
}); 

Vous pouvez l'essayer en action dans Plunker Example

+0

Cela semble l'avoir résolu! Fait intéressant, le code lui-même fonctionnait parfaitement sans le décorateur '@ Inject', mais pas dans les tests unitaires! – Nunicorn