Angular 4单元测试错误“ TypeError:ctor不是构造函数”

97
我正在尝试测试我的路由解析器,在测试时出现了TypeError: ctor不是构造函数的错误,但在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 bootstrap吗? - Sibiraj
是的,但我正在测试路由解析器。即使没有HTML或CSS,这是否会影响我的路由解析器? - Aniruddha Das
5个回答

296

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

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

以下是引发此错误的示例:

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

正确的声明是:

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

我在执行{ provide: httpTestingControllerToken, useClass: HttpTestingController }时遇到了错误,其中我声明了const httpTestingControllerToken = new InjectionToken<HttpTestingController>('httpTestingControllerToken');... 这是在尝试替换已弃用的TestBed.get时出现的。有什么想法吗? - lealceldeiro
那么何时使用useClass和useValue? - Rich Finelli

2

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

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

这是因为我设置了一个新的库,它不符合AOT的规范(也没有任何提供者)。所涉及的库必须导出(我谈论的是Typescript导出,而不是Angular模块的导出)在模块中导入的内容(在这种情况下,是组件和管道)。


2
我曾在Firebase Universal Starter项目中使用Angular Universal时遇到问题。我已经失去了希望,因为stackoverflow上的所有潜在解决方法都没有起作用。所以我做了以下事情:
  1. 使用https://www.npmjs.com/package/npm-check-updates更新所有npm包
  2. 删除node_modules和.package-lock.json并重新安装它们
  3. 修复由于更改的api导致的所有错误
  4. 现在它可以工作了 :-)
我从未找出是哪个包引起了错误,但是找出问题的一种方法是创建一个MockAppModule,逐个删除模块。最终您将找到有问题的模块。但在我的情况下,我猜运气好像是由于其中一个有缺陷的软件包得到了更新或其他原因。

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

1

第三种可能性是,我有一个包含其他模块的模块,并且没有导出(使用TypeScript的术语)其他模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接