lỗi kiểm tra đơn vị góc 4 `TypeError: ctor không phải là hàm tạo`


90

Tôi đang cố gắng kiểm tra trình giải quyết tuyến đường của mình và trong khi kiểm tra, tôi đã nhận được TypeError: ctor is not a constructorvà không biết tại sao nó lại xảy ra trong khi thời gian biên dịch bản ghi kiểu không có lỗi.

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)

bạn đang sử dụng ng2 bootstrap
Sibiraj

Đúng. nhưng tôi đang thử nghiệm trình giải quyết tuyến đường. là thực resolver tuyến đường của tôi thậm chí có không html hoặc css
Aniruddha Das

Câu trả lời:


270

Đây có thể là một lỗi trong khai báo của nhà cung cấp.

Khi bạn cố gắng bắt chước một nhà cung cấp và sử dụng useClass thay vì useValue, lỗi "TypeError: ctor không phải là một phương thức khởi tạo" được kích hoạt.

Đây là một ví dụ gây ra lỗi:

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

Khai báo đúng là:

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

4
Bạn đã cứu một ngày của tôi
Rashmi Kumari

2
Ồ, cảm ơn bạn, tôi đã nhìn chằm chằm vào cái này quá lâu trước khi tôi nhìn thấy nó.
Michael Guthrie

1
Vâng, những gì bạn biết không. Không phải lần đầu tiên tôi mắc lỗi này. Đã ủng hộ câu trả lời!
Kildareflare

Tôi gặp lỗi này trong khi thực hiện { provide: httpTestingControllerToken, useClass: HttpTestingController },, nơi tôi đã khai báo const httpTestingControllerToken = new InjectionToken<HttpTestingController>('httpTestingControllerToken');... đây là khi cố gắng thay thế lỗi không được dùng nữa TestBed.get. Có ý kiến ​​gì không?
lealceldeiro

2

Tôi đã có cùng một thông báo khi xây dựng ứng dụng của mình với AOT.

Vấn đề của tôi không liên quan đến nhà cung cấp như @abahet đã đề xuất.

Đó là do tôi thiết lập một thư viện mới không tuân thủ AOT (và cũng không có bất kỳ nhà cung cấp nào). Thư viện được đề cập phải xuất (tôi đang nói về việc xuất từ ​​Typecript, không phải từ mô-đun Angular) những gì đã được nhập trong mô-đun (trong trường hợp này là một thành phần và một đường ống).


2

Tôi đã gặp sự cố này với Angular Universal kết hợp với Firebase trong dự án Firebase Universal Starter. Tôi gần như mất hy vọng vì tất cả các bản sửa lỗi tiềm năng về tràn ngăn xếp đều không giúp được gì. Vì vậy, tôi đã làm như sau:

  1. Cập nhật tất cả các gói npm với https://www.npmjs.com/package/npm-check-updates
  2. Xóa node_modules và .package-lock.json và cài đặt lại chúng
  3. Đã sửa tất cả các lỗi do api đã thay đổi
  4. Bây giờ nó đã hoạt động :-)

Tôi chưa bao giờ tìm ra gói nào gây ra lỗi, nhưng một cách tiếp cận để tìm hiểu là tạo MockAppModule nơi bạn xóa từng mô-đun một. Cuối cùng, bạn sẽ tìm thấy một trong những vấn đề. Nhưng trong trường hợp của tôi, tôi đã gặp may, tôi đoán là do một trong những gói bị nghe lén đã được cập nhật hoặc cái gì đó.


1

Khả năng thứ ba cho bạn, tôi có một mô-đun chứa các mô-đun khác và không xuất (nói kiểu chữ) các mô-đun khác.


1

Tôi cũng gặp sự cố này với AOT được kích hoạt. Tôi đã thêm một tệp dịch vụ mới. Tôi đã khởi động lại trình biên dịch và sự cố đã được giải quyết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.