1

je un composant qui utilise l'une des deux classes d'aide, comme:Comment injecter classe d'aide dynamique

import {HelperA} ... 
import {HelperB} ... 
... 

@Component({..}) 
export class MyComponent implements OnInit { 
    helper: Helper;  
    constructor(private ref: ElementRef, private device: MyDeviceDetectionService) {} 

    ngOnInit() { 
     if (this.device.isMobile) { 
      this.helper = new HelperA(this.ref); 
     } else { 
      this.helper = new HelperB(this.ref); 
     } 
    } 
} 

Je me rends compte que cela est difficile à tester l'unité, alors comment puis-je injecter ces? Idéalement, je n'ai besoin que de l'un d'entre eux, selon que isMobile est vrai ou faux.

+0

mettre à jour les codes pour 'HelperA' et' HelperB' – Aravind

+0

Comment les refactoriser dans une classe de base? Pas d'injection, ils sont toujours là, etc. Ma question, quel est votre problème avec les tests? – SayusiAndo

+0

Je ne peux pas mocker les classes directement importées (pour autant que je sache) –

Répondre

3

Il est possible que vous puissiez pousser tout cela vers l'injecteur. En supposant que les deux aides ont une superclasse commune nommée Helper, utilisez l'option du fournisseur useFactory pour créer selon votre besoin:

providers: [ 
    ..., 
    { provide: Helper, useFactory: createHelper, deps: [MyDeviceDetectionService, ElementRef] }, 
] 

Ensuite, l'usine ressemblerait à ceci:

export function createHelper(device: MyDeviceDetectionService, ref: ElementRef): Helper { 
    if (device.isMobile) { 
    return new HelperA(ref); 
    } else { 
    return new HelperB(ref); 
    } 
} 

Notez que cela devra être dans le tableau des fournisseurs du composant, car la référence de l'élément n'est pas disponible au niveau du module.

+0

très probablement la valeur ElementRef devrait être passée dans la méthode d'usine –

+0

Je peux passer l'élément ref plus tard (pas le constructeur), ce qui le rendrait plus facile –

+1

@JeanlucaScaljeri oui, vous pourriez avoir par exemple 'this.helper.setRef (this.ref);' à un certain point si le DI ne fonctionne pas; L'inconvénient est que si vous oubliez de le faire quelque part, vous laissez l'objet dans un état inutilisable. – jonrsharpe