Ошибка модульного тестирования angular 4 `TypeError: ctor не является конструктором`


90

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

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
Сибирадж

да. но я тестирую преобразователь маршрутов. это влияет на мой распознаватель маршрутов, даже если там нет html или css
Aniruddha Das

Ответы:


271

Это может быть ошибка в объявлениях провайдеров.

Когда вы пытаетесь издеваться над поставщиком и используете useClass вместо useValue, выдается ошибка «TypeError: ctor не конструктор».

Вот пример, вызывающий ошибку:

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

Правильное объявление:

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

4
Ты спас мне день
Рашми Кумари

2
О, спасибо, я бы слишком долго смотрел на это, прежде чем я это увидел.
Майкл Гатри

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.