Test - ne Peut pas résoudre tous les paramètres (ClassName)
Contexte
J'ai créé un ApiService
classe pour être en mesure de traiter vos requêtes API, tout en utilisant notre propre sérialiseur + d'autres fonctionnalités.
ApiService
's signature du constructeur est:
constructor(metaManager: MetaManager, connector: ApiConnectorService, eventDispatcher: EventDispatcher);
MetaManager
est un injectable service qui se charge de l'api de méta-données.ApiConnectorService
est un service d'emballageHttp
pour ajouter nos en-têtes personnalisés et système de signature.EventDispatcher
est essentiellement de Symfony répartiteur d'évènement système, en caractères d'imprimerie.
Problème
Quand je test le ApiService
, je fais une phase d'initialisation dans beforeEach
:
beforeEach(async(() => {
TestBed.configureTestingModule({
imports : [
HttpModule
],
providers: [
ApiConnectorService,
ApiService,
MetaManager,
EventDispatcher,
OFF_LOGGER_PROVIDERS
]
});
}));
et il fonctionne très bien.
Puis-je ajouter mon deuxième fichier de spécification, qui est pour ApiConnectorService
, avec cette beforeEach
:
beforeEach(async(() => {
TestBed.configureTestingModule({
imports : [HttpModule],
providers: [
ApiConnectorService,
OFF_LOGGER_PROVIDERS,
AuthenticationManager,
EventDispatcher
]
});
}));
Et tous les tests échoue avec ce message d'erreur:
Erreur: ne Peut pas résoudre tous les paramètres pour ApiService: (MetaManager, ?, EventDispatcher).
- Si je supprime
api-connector-service.spec.ts
(ApiConnectorService
's dans le fichier de spécification) de mon chargés des tests,ApiService
's des tests de réussir. - Si je supprime
api-service.spec.ts
(ApiService
's dans le fichier de spécification) de mon chargés des tests,ApiConnectorService
's des tests de réussir.
Pourquoi j'ai cette erreur? Il semble que le contexte entre deux de mes fichiers sont en conflit et je ne sais pas pourquoi et comment résoudre ce problème.
Vous devez vous connecter pour publier un commentaire.
C'est parce que la
Http
service ne peut pas être résolu à partir de laHttpModule
, dans un environnement de test. Il est dépendant de la plate-forme de navigateur. Tu ne devrais même pas essayer de faire XHR appels de toute façon pendant les tests.Pour cette raison, Angulaire fournit un
MockBackend
pour laHttp
service à utiliser. Nous utilisons cette maquette backend pour vous abonner à des connexions lors de nos tests, et on peut se moquer de la réponse lors de chaque connexion est établie.Voici un petit exemple complet, vous pouvez travailler hors de
JS:
MockBackend, BaseRequestOptions
au lieu de{ provide: MockBackend, useClass: MockBackend }, { provide: BaseRequestOptions, useClass: BaseRequestOptions },
. N'est-ce pas de deux est déjà prévue par leHttpModule
(je suis sûr qu'ils sont). Aussiproviders: [ { provide: Http, useFactory: (backend, options) => { return new Http(backend, options); }, deps: [MockBackend, BaseRequestOptions] },
peut être raccourcie à{provide: XHRBackend: useExisting: MockBackend}
providers: [{provide: XHRBackend: useExisting: MockBackend}, SomeService]
devrait vous donner le même résultat.XHRBackend
que le jeton, mais j'ai oublié que j'étais injectionMockBackend
type. Donc je l'ai changé pourMockBackend
jeton. Ne pensais pas du style à l'époque, c'était juste une solution rapide à l'époque j'ai été le tester.constructor(private http: Http, baseName: string) {
, j'ai donc besoin de modifier dans le code ci-dessus?La question n'était pas vraiment résolu dans la réponse choisie, ce qui est vraiment juste une recommandation pour écrire des tests, mais plutôt dans les commentaires, et vous devez suivre un lien et recherche pour cela. Depuis que j'ai eu un autre problème avec le même message d'erreur, je vais ajouter deux solutions ici.
Si vous avez un tonneau (de l'index.ts ou multi fichier d'exportation) comme ceci:
Ensuite, vous pouvez obtenir une erreur, comme
EXCEPTION: Can't resolve all parameters for MyComponent: (?)
.Pour résoudre ce problème, vous devez exporter le service avant que le composant:
Le même message d'erreur peut se produire en raison d'un
circular dependency
qui provoque uneundefined
service de l'importation. Pour le vérifier,console.log(YourService)
après l'importation (dans votre fichier de test - où le problème se pose). Si c'est pas défini, vous pouvez avoir fait un index.ts fichier (le baril), de l'exportation à la fois le service et le fichier de l'utiliser (composant/effet/tout ce que vous faites des tests) - par l'importation du service à partir du fichier d'index où les deux sont exportés (en faisant d'elle un cercle complet).Trouver ce fichier et importer le service dont vous avez besoin directement à partir de
your.service.ts
fichier au lieu de l'index.