Angular 4 błąd testowania jednostkowego `TypeError: ctor nie jest konstruktorem`

90

Próbuję przetestować mój program rozpoznawania tras i podczas testowania otrzymałem TypeError: ctor is not a constructori nie mam pojęcia, dlaczego tak się dzieje, gdy czas kompilacji maszynopisu nie ma błędu.

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)
Aniruddha Das
źródło
czy używasz ng2 bootstrap
Sibiraj
tak. ale testuję program rozpoznawania tras. czy to działa na mój resolver routingu, nawet jeśli nie ma html lub css
Aniruddha Das

Odpowiedzi:

270

Może to być błąd w deklaracjach dostawców.

Podczas próby sfałszowania dostawcy i użycia useClass zamiast useValue wywoływany jest błąd „TypeError: ctor is not a constructor”.

Oto przykład, który uruchamia błąd:

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

Prawidłowa deklaracja to:

providers: [{provide: OrderService, useValue: new OrderServiceMock()}]
abahet
źródło
4
Uratowałeś mi dzień
Rashmi Kumari,
2
Och, dziękuję, gapiłbym się na to zbyt długo, zanim to zobaczyłem.
Michael Guthrie
1
Cóż, co wiesz. Nie pierwszy raz popełniłem ten błąd. Głosowałem już za odpowiedzią!
Kildareflare
Otrzymuję ten błąd podczas robienia { provide: httpTestingControllerToken, useClass: HttpTestingController },, gdzie zadeklarowałem const httpTestingControllerToken = new InjectionToken<HttpTestingController>('httpTestingControllerToken');... to jest podczas próby zastąpienia przestarzałego TestBed.get. Jakieś pomysły?
lealceldeiro
2

Dokładnie ten sam komunikat otrzymałem podczas tworzenia aplikacji za pomocą AOT.

Mój problem nie był związany z dostawcami, jak sugerował @abahet.

To dlatego, że skonfigurowałem nową bibliotekę, która nie była zgodna z AOT (i nie miała też żadnego dostawcy). Biblioteka, o której mowa, musiała wyeksportować (mówię o eksporcie Typescript, a nie z modułu Angular) to, co zostało zaimportowane w module (w tym przypadku komponent i potok).

maxime1992
źródło
2

Miałem ten problem z Angular Universal w połączeniu z Firebase w projekcie Firebase Universal Starter. Prawie straciłem nadzieję, ponieważ wszystkie potencjalne poprawki przepełnienia stosu nie pomogły. Zrobiłem więc co następuje:

  1. Zaktualizuj wszystkie pakiety npm za pomocą https://www.npmjs.com/package/npm-check-updates
  2. Usuń node_modules i .package-lock.json i zainstaluj je ponownie
  3. Naprawiono wszystkie błędy spowodowane zmienionymi interfejsami API
  4. Teraz działało :-)

Nigdy nie dowiedziałem się, który pakiet spowodował błąd, ale jednym ze sposobów, aby się tego dowiedzieć, jest utworzenie MockAppModule, w którym usuwasz moduły jeden po drugim. W końcu znajdziesz tego z problemem. Ale w moim przypadku miałem szczęście, ponieważ jeden z błędnych pakietów został zaktualizowany lub coś takiego.

enf0rcer
źródło
1

Trzecia możliwość dla ciebie, miałem moduł zawierający inne moduły i nie eksportowałem (mówienie na maszynie) innych modułów.

Michael Laffargue
źródło
1

Ja też miałem ten problem z włączonym AOT Dodałem nowy plik usługi. Zrestartowałem kompilator i problem został rozwiązany.

6by3
źródło