angular 4 unit testing error `TypeError: ctor is not a constructor`

angular 4 unit testing error `TypeError: ctor is not a constructor`

我正在尝试测试我的路由解析器,在测试时我得到了 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 (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 (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)

这可能是提供商声明中的错误。

当您尝试模拟提供者并使用 useClass 而不是 useValue 时,会引发错误 "TypeError: ctor is not a constructor"。

这是引发错误的示例:

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

正确的声明是:

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

我在使用 AOT 构建我的应用程序时收到了完全相同的消息。

我的问题与@abahet 建议的提供商无关。

这是因为我设置了一个不符合 AOT 的新库(也没有任何提供程序)。有问题的库必须 export (我说的是 Typescript 导出,而不是 Angular 模块中的那个)模块中导入的内容(在本例中是一个组件和一根管子)。

第三种可能性,我有一个包含其他模块的模块并且没有导出(Typescript 来说)其他模块。

我在 Firebase Universal Starter 项目中将 Angular Universal 与 Firebase 结合使用时遇到了这个问题。我几乎失去了希望,因为堆栈溢出的所有潜在修复都无济于事。所以我做了以下事情:

  1. 使用 https://www.npmjs.com/package/npm-check-updates
  2. 更新所有 npm 包
  3. 删除 node_modules 和 .package-lock.json 并重新安装它们
  4. 修复了由于更改 api 的
  5. 而导致的所有错误
  6. 现在可以使用了:-)

我从来没有发现是什么包导致了错误,但是找出错误的一种方法是创建一个 MockAppModule,您可以在其中一个一个地删除模块。最终你会找到有问题的那个。但就我而言,我很幸运,我猜是因为其中一个有问题的软件包得到了更新或其他原因。

我也遇到了 AOT 的这个问题 enabled.I 添加了一个新的服务文件。我重新启动了编译器,问题就解决了。