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)

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()}]

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).


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.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.