角度4单元测试错误`TypeError:ctor不是构造函数`

时间:2017-06-16 20:31:27

标签: angular karma-runner angular-routing

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

5 个答案:

答案 0 :(得分:161)

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

当您尝试模拟提供程序并使用useClass而不是useValue时,错误" TypeError:ctor不是构造函数"被解雇了。

以下是触发错误的示例:

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

正确的声明是:

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

答案 1 :(得分:3)

使用AOT构建我的应用时,我收到完全相同的消息。

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

这是因为我设置了一个不符合AOT标准的新库(并且没有任何提供商)。有问题的库必须导出(我在谈论Typescript导出,而不是Angular模块中的导出)在模块中导入的内容(在本例中是组件和管道)。

答案 2 :(得分:2)

我在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. 现在它正在运作: - )
  7. 我从来没有发现什么包导致错误,但找到的一种方法是创建一个MockAppModule,您可以逐个删除模块。最终你会找到有问题的那个。但在我的情况下,我很幸运,我猜是因为其中一个漏洞的软件包得到了更新或其他内容。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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