ข้อผิดพลาดในการทดสอบหน่วยเชิงมุม 4 "TypeError: ctor ไม่ใช่ตัวสร้าง"


90

ฉันกำลังพยายามทดสอบตัวแก้ไขเส้นทางของฉันและขณะทดสอบฉันได้รับ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)

คุณใช้ ng2 bootstrap
Sibiraj

ใช่. แต่ฉันกำลังทดสอบตัวแก้ไขเส้นทาง นั่นมีผลกับตัวแก้ไขเส้นทางของฉันแม้ว่าจะไม่มี html หรือ css
Aniruddha Das

คำตอบ:


271

นี่อาจเป็นข้อผิดพลาดในการประกาศผู้ให้บริการ

เมื่อคุณพยายามล้อเลียนผู้ให้บริการและใช้ useClass แทน useValue ข้อผิดพลาด "TypeError: ctor ไม่ใช่ตัวสร้าง" จะเริ่มทำงาน

นี่คือตัวอย่างที่ทำให้เกิดข้อผิดพลาด:

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

การประกาศที่ถูกต้องคือ:

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

4
คุณช่วยชีวิตฉันไว้
Rashmi Kumari

2
โอ้ขอบคุณฉันคงจ้องมองมานานเกินไปก่อนที่จะเห็นแบบนั้น
Michael Guthrie

1
คุณรู้อะไรบ้าง ไม่ใช่ครั้งแรกที่ฉันทำผิดพลาดนี้ ได้โหวตคำตอบแล้ว!
Kildareflare

ฉันได้รับข้อผิดพลาดนี้ในขณะที่ทำ{ provide: httpTestingControllerToken, useClass: HttpTestingController },ที่ฉันประกาศconst httpTestingControllerToken = new InjectionToken<HttpTestingController>('httpTestingControllerToken');... TestBed.getนี่คือเมื่อพยายามที่จะเข้ามาแทนที่เลิก ความคิดใด ๆ ?
lealceldeiro

2

ฉันมีข้อความเหมือนกันทุกประการเมื่อสร้างแอปกับ AOT

ปัญหาของฉันไม่เกี่ยวข้องกับผู้ให้บริการตามที่ @abahet แนะนำ

เป็นเพราะฉันตั้งค่าห้องสมุดใหม่ซึ่งไม่สอดคล้องกับ AOT (และไม่มีผู้ให้บริการด้วย) ไลบรารีที่มีปัญหาต้องส่งออก (ฉันกำลังพูดถึงการส่งออก typescript ไม่ใช่จากโมดูลเชิงมุม) สิ่งที่นำเข้าในโมดูล (ในกรณีนี้คือส่วนประกอบและท่อ)


2

ฉันมีปัญหานี้กับ Angular Universal ร่วมกับ Firebase ในโครงการ Firebase Universal Starter ฉันเกือบจะหมดความหวังเนื่องจากการแก้ไขที่เป็นไปได้ทั้งหมดในสแต็กล้นไม่ได้ช่วย ฉันจึงทำสิ่งต่อไปนี้:

  1. อัปเดตแพ็คเกจ npm ทั้งหมดด้วยhttps://www.npmjs.com/package/npm-check-updates
  2. ลบ node_modules และ .package-lock.json และติดตั้งใหม่
  3. แก้ไขข้อผิดพลาดทั้งหมดเนื่องจาก api ที่เปลี่ยนแปลง
  4. ตอนนี้มันทำงาน :-)

ฉันไม่เคยพบว่าแพ็คเกจใดทำให้เกิดข้อผิดพลาด แต่วิธีหนึ่งในการค้นหาคือการสร้าง MockAppModule ที่คุณลบโมดูลทีละโมดูล ในที่สุดคุณจะพบคนที่มีปัญหา แต่ในกรณีของฉันฉันโชคดีฉันเดาว่าเนื่องจากแพ็คเกจที่ถูกดักฟังได้รับการอัปเดตหรืออะไรบางอย่าง


1

ความเป็นไปได้ประการที่สามสำหรับคุณฉันมีโมดูลที่มีโมดูลอื่นและไม่ได้ส่งออก (การพูดของ typescript) กับโมดูลอื่น ๆ


1

ฉันประสบปัญหานี้เช่นกันเมื่อเปิดใช้งาน AOT ฉันได้เพิ่มไฟล์บริการใหม่ ฉันรีสตาร์ทคอมไพเลอร์และปัญหาได้รับการแก้ไข

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.