erreur de test angulaire 4 unitaire `TypeError: ctor n'est pas un constructeur`


90

J'essaie de tester mon résolveur de route et pendant les tests, je n'ai TypeError: ctor is not a constructoraucune idée de pourquoi cela se produit alors que le temps de compilation dactylographié ne comporte aucune erreur.

TypeError: ctor is not a constructor
TypeError: ctor is not a constructor
    at _createClass (http://localhost:9877/_karma_webpack_/vendor.bundle.js:42355:26)
    at _createProviderInstance$1 (http://localhost:9877/_karma_webpack_/vendor.bundle.js:42330:26)
    at resolveNgModuleDep (http://localhost:9877/_karma_webpack_/vendor.bundle.js:42315:17)
    at _createClass (http://localhost:9877/_karma_webpack_/vendor.bundle.js:42362:26)
    at _createProviderInstance$1 (http://localhost:9877/_karma_webpack_/vendor.bundle.js:42330:26)
    at resolveNgModuleDep (http://localhost:9877/_karma_webpack_/vendor.bundle.js:42315:17)
    at NgModuleRef_.webpackJsonp../node_modules/@angular/core/@angular/core.es5.js.NgModuleRef_.get (http://localhost:9877/_karma_webpack_/vendor.bundle.js:43401:16)
    at TestBed.webpackJsonp../node_modules/@angular/core/@angular/core/testing.es5.js.TestBed.get (http://localhost:9877/_karma_webpack_/vendor.bundle.js:48412:47)
    at http://localhost:9877/_karma_webpack_/vendor.bundle.js:48418:61
    at Array.map (native)

utilisez-vous ng2 bootstrap
Sibiraj

Oui. mais je teste le résolveur de route. est-ce que cela affecte mon résolveur de route même s'il n'y a pas de html ou de css
Aniruddha Das

Réponses:


270

Cela peut être une erreur dans les déclarations des fournisseurs.

Lorsque vous essayez de vous moquer d'un fournisseur et d'utiliser useClass au lieu de useValue, l'erreur «TypeError: ctor n'est pas un constructeur» est déclenchée.

Voici un exemple qui déclenche l'erreur:

providers: [{provide: OrderService, useClass: new OrderServiceMock()}]

La déclaration correcte est:

providers: [{provide: OrderService, useValue: new OrderServiceMock()}]

4
Vous avez sauvé ma journée
Rashmi Kumari

2
Oh merci, j'aurais regardé ça bien trop longtemps avant de voir ça.
Michael Guthrie

1
Bien, que sait-tu. Pas la première fois que je fais cette erreur. Ont déjà voté pour la réponse!
Kildareflare

J'obtiens cette erreur en faisant { provide: httpTestingControllerToken, useClass: HttpTestingController },, où j'ai déclaré const httpTestingControllerToken = new InjectionToken<HttpTestingController>('httpTestingControllerToken');... c'est en essayant de remplacer le obsolète TestBed.get. Des idées?
lealceldeiro

2

J'ai eu exactement le même message lors de la création de mon application avec AOT.

Mon problème n'était pas lié aux fournisseurs comme le suggérait @abahet.

C'était parce que j'avais configuré une nouvelle bibliothèque qui n'était pas conforme à AOT (et n'avait aucun fournisseur non plus). La bibliothèque en question devait exporter (je parle d'export Typescript, pas celle du module Angular) ce qui était importé dans le module (dans ce cas, un composant et un tube).


2

J'ai eu ce problème avec Angular Universal en combinaison avec Firebase dans un projet Firebase Universal Starter. J'avais presque perdu espoir car toutes les corrections potentielles sur le débordement de pile n'ont pas aidé. J'ai donc fait ce qui suit:

  1. Mettez à jour tous les packages npm avec https://www.npmjs.com/package/npm-check-updates
  2. Supprimez node_modules et .package-lock.json et réinstallez-les
  3. Correction de toutes les erreurs dues à la modification des API
  4. Maintenant ça fonctionnait :-)

Je n'ai jamais découvert quel package a causé une erreur, mais une approche pour le savoir consiste à créer un MockAppModule dans lequel vous supprimez les modules un par un. Finalement, vous trouverez celui avec le problème. Mais dans mon cas, j'ai eu de la chance, je suppose, à cause de l'un des paquets buggés mis à jour ou quelque chose du genre.


1

Troisième possibilité pour vous, j'avais un module contenant d'autres modules et je n'ai pas exporté (en langage typographique) les autres modules.


1

J'ai aussi eu ce problème avec AOT activé. J'ai ajouté un nouveau fichier de service. J'ai redémarré le compilateur et le problème est résolu.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.