角度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ブートストラップを使用していますか
Sibiraj 2017年

はい。しかし、私はルートリゾルバーをテストしています。htmlやcssがなくてもルートリゾルバーに影響を与えるということです
Aniruddha Das

回答:


270

これは、プロバイダー宣言のエラーである可能性があります。

プロバイダーをモックしてuseValueの代わりにuseClassを使用しようとすると、「TypeError:ctorはコンストラクターではありません」というエラーが発生します。

エラーを発生させる例を次に示します。

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

正しい宣言は次のとおりです。

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

4
あなたは私の日を救った
Rashmi Kumari 2017

2
ああ、ありがとう、私はそれを見る前にずっとずっとこれを見つめていたでしょう。
Michael Guthrie

1
さて、あなたは何を知っていますか。私がこの間違いをしたのは初めてではありません。すでに答えに賛成しています!
キルダレフレア2018年

私が{ provide: httpTestingControllerToken, useClass: HttpTestingController },宣言したところ、実行中にこのエラーが発生しconst httpTestingControllerToken = new InjectionToken<HttpTestingController>('httpTestingControllerToken');ます...これは非推奨のを置き換えようとしたときですTestBed.get。何か案は?
lealceldeiro

2

AOTを使用してアプリをビルドしたときに、まったく同じメッセージが表示されました。

@abahetが示唆したように、私の問題はプロバイダーとは関係ありませんでした。

これは、AOTに準拠していない(プロバイダーもなかった)新しいライブラリをセットアップしたためです。問題のライブラリは、モジュールにインポートされたもの(この場合はコンポーネントとパイプ)をエクスポートする必要がありました(Angularモジュールからのものではなく、Typescriptエクスポートについて話しています)。


2

Firebase Universal Starterプロジェクトで、AngularUniversalをFirebaseと組み合わせて使用​​するとこの問題が発生しました。スタックオーバーフローのすべての潜在的な修正が役に立たなかったので、私はほとんど希望を失っていました。だから私は次のことをしました:

  1. https://www.npmjs.com/package/npm-check-updatesですべてのnpmパッケージを更新します
  2. node_modulesと.package-lock.jsonを削除し、それらを再インストールしました
  3. 変更されたAPIによるすべてのエラーを修正しました
  4. 今それは働いていました:-)

どのパッケージがエラーの原因であるかはわかりませんでしたが、モジュールを1つずつ削除するMockAppModuleを作成する方法があります。最終的には、問題のあるものが見つかります。しかし、私の場合、バグのあるパッケージの1つが更新されたなどの理由で、幸運に恵まれたと思います。


1

3番目の可能性として、他のモジュールを含むモジュールがあり、他のモジュールをエクスポートしませんでした(Typescriptで言えば)。


1

私もAOTを有効にするとこの問題が発生しました。新しいサービスファイルを追加しました。コンパイラを再起動すると、問題は解決しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.