açısal 4 birim test hatası "TypeError: ctor bir yapıcı değil"


90

Yol çözümleyicimi test etmeye çalışıyorum ve test TypeError: ctor is not a constructorederken, daktilo derleme zamanı hata yokken neden olduğu hakkında hiçbir fikrim yok.

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 önyükleme kullanıyor musunuz
Sibiraj

Evet. ancak yol çözümleyiciyi test ediyorum. html veya css olmasa bile rota çözümleyicimi
etkiliyor mu?

Yanıtlar:


271

Bu, sağlayıcı bildirimlerinde bir hata olabilir.

Bir sağlayıcıyla dalga geçmeye ve useValue yerine useClass'ı kullanmaya çalıştığınızda "TypeError: ctor bir yapıcı değil" hatası tetikleniyor.

İşte hatayı tetikleyen bir örnek:

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

Doğru beyan:

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


2
Oh teşekkür ederim, bunu görmeden önce buna çok uzun süre bakardım.
Michael Guthrie

1
Peki ne biliyorsun? Bu hatayı yaptığım ilk sefer değil. Yanıtı çoktan onayladınız!
Kildareflare

Bu hatayı yaparken { provide: httpTestingControllerToken, useClass: HttpTestingController },, ilan ettiğim yerde alıyorum const httpTestingControllerToken = new InjectionToken<HttpTestingController>('httpTestingControllerToken');... bu, kullanımdan kaldırılanı değiştirmeye çalışırken TestBed.get. Herhangi bir fikir?
lealceldeiro

2

Uygulamamı AOT ile oluştururken tamamen aynı mesajı aldım.

Sorunum, @abahet'in önerdiği gibi sağlayıcılarla ilgili değildi.

Bunun nedeni, AOT uyumlu olmayan (ve herhangi bir sağlayıcısı da olmayan) yeni bir kitaplık kurmamdı. Söz konusu kütüphane, modülde içe aktarılanları (bu durumda, bir bileşen ve bir boru) dışa aktarmak zorunda kaldı (Angular modülünden değil, Typescript ihracatından bahsediyorum).


2

Bu sorunu bir Firebase Universal Starter projesinde Firebase ile birlikte Angular Universal ile yaşadım. Yığın taşmasıyla ilgili tüm olası düzeltmeler yardımcı olmadığından neredeyse umudumu yitirmiştim. Ben de şunları yaptım:

  1. Tüm npm paketlerini https://www.npmjs.com/package/npm-check-updates ile güncelleyin
  2. Node_modules ve .package-lock.json'u kaldırın ve yeniden yükleyin
  3. API'nin değiştirilmesinden kaynaklanan tüm hatalar düzeltildi
  4. Şimdi çalışıyor :-)

Hangi paketin hataya neden olduğunu asla bulamadım, ancak bulmak için bir yaklaşım, modülleri tek tek kaldırdığınız bir MockAppModule oluşturmaktır. Sonunda problemi olanı bulacaksınız. Ama benim durumumda, hatalı paketlerden birinin güncellendiği veya başka bir şey yüzünden şanslıydım.


1

Üçüncü olasılık, diğer modülleri içeren bir modülüm vardı ve diğer modülleri dışa aktarmadım (Typescript konuşuyor).


1

AOT etkinken ben de bu sorunu yaşadım, yeni bir servis dosyası ekledim. Derleyiciyi yeniden başlattım ve sorun çözüldü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.