помилка тестування кутового 4 `TypeError: ctor не є конструктором`


90

Я намагаюся протестувати свій вирішувач маршруту, і під час тестування я TypeError: ctor is not a constructorне знав, чому це сталося, коли під час компіляції TypeScript помилок не було.

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)

ви використовуєте ng2 bootstrap
Sibiraj

так. але я тестую вирішувач маршрутів. полягає в тому, що для мого вирішення проблеми маршруту навіть там немає html чи css
Aniruddha Das

Відповіді:


270

Це може бути помилкою в деклараціях провайдерів.

При спробі знущатися над постачальником і використовувати useClass замість useValue запускається помилка "TypeError: ctor is not a constructor".

Ось приклад, який запускає помилку:

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

Правильна декларація:

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

4
Ти врятував мій день
Рашмі Кумарі

2
О, дякую, я б занадто довго дивився на це, перш ніж побачив це.
Michael Guthrie

1
Ну, що ти знаєш. Я не вперше допускаю цю помилку. Вже підтримали відповідь!
Kildareflare,

Я отримую цю помилку під час { provide: httpTestingControllerToken, useClass: HttpTestingController },, де я заявив const httpTestingControllerToken = new InjectionToken<HttpTestingController>('httpTestingControllerToken');... це при спробі замінити застаріле TestBed.get. Будь-які ідеї?
lealceldeiro

2

У мене було саме те саме повідомлення при створенні мого додатка за допомогою AOT.

Моя проблема не була пов’язана з провайдерами, як запропонував @abahet.

Це було тому, що я налаштував нову бібліотеку, яка не відповідала AOT (і не мала жодного постачальника). Бібліотека, про яку йде мова, повинна була експортувати (я говорю про експорт Typescript, а не про те з модуля Angular), що було імпортовано в модулі (в даному випадку компонент та конвеєр).


2

У мене була проблема з Angular Universal у поєднанні з Firebase у проекті Firebase Universal Starter. Я майже втратив надію, оскільки всі потенційні виправлення переповнення стека не допомогли. Тож я зробив наступне:

  1. Оновіть усі пакунки npm за допомогою https://www.npmjs.com/package/npm-check-updates
  2. Видаліть node_modules та .package-lock.json і переінсталюйте їх
  3. Виправлені всі помилки через змінені API
  4. Тепер це працювало :-)

Я ніколи не дізнався, який пакет спричинив помилку, але один із підходів, щоб дізнатися це, - створити MockAppModule, де ви видаляєте модулі по одному. Зрештою ви знайдете того, у кого проблема. Але в моєму випадку мені пощастило, мабуть, через оновлення одного з виправлених пакетів чи щось інше.


1

Третя можливість для вас: у мене був модуль, що містить інші модулі, і я не експортував (розмовляючи Typescript) інші модулі.


1

У мене теж була ця проблема з включеним AOT. Я додав новий файл служби. Я перезапустив компілятор, і проблема вирішена.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.