角度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 bootstrap
Sibiraj

是。但是我正在测试路由解析器。即使没有html或css,也会影响我的路由解析器
Aniruddha Das

Answers:


270

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

当您尝试模拟提供程序并使用useClass而不是useValue时,会引发错误“ TypeError:ctor不是构造函数”。

这是引发错误的示例:

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

正确的声明是:

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

4
您救了我的一天
Rashmi Kumari

2
哦,谢谢,我早就盯着这个看了这么久。
Michael Guthrie '18

1
好吧,你知道什么。我不是第一次犯这个错误。已经提高了答案!
Kildareflare

我在执行此操作时遇到此错误{ provide: httpTestingControllerToken, useClass: HttpTestingController },,我在此处声明const httpTestingControllerToken = new InjectionToken<HttpTestingController>('httpTestingControllerToken');...这是在尝试替换不推荐使用的时TestBed.get。有任何想法吗?
lealceldeiro

2

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

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

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


2

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

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

我从来没有发现导致错误的程序包,但是一种发现方法是创建一个MockAppModule,在其中逐个删除模块。最终,您会找到一个有问题的人。但就我而言,我很幸运,我猜是由于其中一个错误的软件包已更新或其他原因。


1

对您来说,第三种可能性是,我有一个包含其他模块的模块,而没有导出(使用Typescript讲)其他模块。


1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.