errore di test di unità angolare 4 `TypeError: ctor non è un costruttore`


90

Sto provando a testare il mio risolutore di percorsi e durante il test non ho TypeError: ctor is not a constructoridea del perché sia ​​accaduto durante la compilazione del dattiloscritto senza errori.

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)

stai usando ng2 bootstrap
Sibiraj

sì. ma sto testando route resolver. è che sta effettuando il mio risolutore di percorsi anche se non c'è html o css
Aniruddha Das

Risposte:


271

Questo può essere un errore nelle dichiarazioni dei provider.

Quando si tenta di deridere un provider e utilizzare useClass invece di useValue, viene generato l'errore "TypeError: ctor non è un costruttore".

Ecco un esempio che genera l'errore:

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

La dichiarazione corretta è:

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

4
Mi hai salvato la giornata
Rashmi Kumari

2
Oh grazie, avrei fissato questo per troppo tempo prima di vederlo.
Michael Guthrie

1
Ebbene, cosa ne sai. Non è la prima volta che faccio questo errore. Ho già votato positivamente la risposta!
Kildareflare

Ricevo questo errore durante l'esecuzione { provide: httpTestingControllerToken, useClass: HttpTestingController },, dove ho dichiarato const httpTestingControllerToken = new InjectionToken<HttpTestingController>('httpTestingControllerToken');... questo è quando provo a sostituire il deprecato TestBed.get. Qualche idea?
lealceldeiro

2

Ho ricevuto lo stesso identico messaggio durante la creazione della mia app con AOT.

Il mio problema non era correlato ai fornitori come suggerito da @abahet.

È stato perché ho impostato una nuova libreria che non era conforme a AOT (e non avevo nemmeno un provider). La libreria in questione doveva esportare (parlo dell'esportazione Typescript, non quella da modulo Angular) quanto importato nel modulo (in questo caso un componente e una pipe).


2

Ho avuto questo problema con Angular Universal in combinazione con Firebase in un progetto Firebase Universal Starter. Avevo quasi perso la speranza perché tutte le potenziali correzioni sullo stack overflow non hanno aiutato. Quindi ho fatto quanto segue:

  1. Aggiorna tutti i pacchetti npm con https://www.npmjs.com/package/npm-check-updates
  2. Rimuovi node_modules e .package-lock.json e reinstallali
  3. Risolti tutti gli errori dovuti a API modificate
  4. Ora funzionava :-)

Non ho mai scoperto quale pacchetto abbia causato l'errore, ma un approccio per scoprirlo è creare un MockAppModule in cui rimuovi i moduli uno per uno. Alla fine troverai quello con il problema. Ma nel mio caso sono stato fortunato, immagino che uno dei pacchetti con bug sia stato aggiornato o qualcosa del genere.


1

Terza possibilità per te, avevo un modulo contenente altri moduli e non ho esportato (dattiloscritto parlando) gli altri moduli.


1

Anch'io ho avuto questo problema con AOT abilitato. Ho aggiunto un nuovo file di servizio. Ho riavviato il compilatore e il problema è stato risolto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.