erro de teste de unidade angular 4 `TypeError: ctor não é um construtor`


90

Estou tentando testar meu resolvedor de rotas e, durante o teste, não tenho TypeError: ctor is not a constructorideia de por que isso aconteceu enquanto o texto digitado é compilado sem erros.

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)

você está usando o ng2 bootstrap
Sibiraj

sim. mas estou testando o resolvedor de rotas. é que afetando meu resolvedor de rota mesmo que não haja html ou css
Aniruddha Das

Respostas:


271

Isso pode ser um erro nas declarações dos provedores.

Quando você tenta simular um provedor e usar useClass em vez de useValue, o erro "TypeError: ctor não é um construtor" é disparado.

Aqui está um exemplo que dispara o erro:

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

A declaração correta é:

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

4
Você salvou meu dia
Rashmi Kumari

2
Oh, obrigado, eu teria olhado para isso por muito tempo antes de ver isso.
Michael Guthrie

1
Bem, o que você sabe. Não é a primeira vez que cometi esse erro. Já votou positivamente na resposta!
Kildareflare

Estou recebendo este erro enquanto faço { provide: httpTestingControllerToken, useClass: HttpTestingController },, onde declarei const httpTestingControllerToken = new InjectionToken<HttpTestingController>('httpTestingControllerToken');... isso é quando tento substituir o obsoleto TestBed.get. Alguma ideia?
lealceldeiro

2

Recebi exatamente a mesma mensagem ao criar meu aplicativo com AOT.

Meu problema não estava relacionado a provedores como @abahet sugeriu.

Foi porque eu configurei uma nova biblioteca que não era compatível com AOT (e também não tinha nenhum provedor). A biblioteca em questão teve que exportar (estou falando de exportação do Typescript, não do módulo Angular) o que foi importado no módulo (neste caso, um componente e um pipe).


2

Tive esse problema com o Angular Universal em combinação com o Firebase em um projeto Firebase Universal Starter. Eu quase perdi as esperanças, pois todas as possíveis correções no estouro de pilha não ajudaram. Então eu fiz o seguinte:

  1. Atualize todos os pacotes npm com https://www.npmjs.com/package/npm-check-updates
  2. Remova node_modules e .package-lock.json e os reinstale
  3. Todos os erros corrigidos devido à alteração da API
  4. Agora estava funcionando :-)

Eu nunca descobri qual pacote causou o erro, mas uma abordagem para descobrir é criar um MockAppModule onde você remove os módulos um por um. Eventualmente, você encontrará aquele com o problema. Mas, no meu caso, tive sorte, acho que um dos pacotes bugados foi atualizado ou algo assim.


1

Terceira possibilidade para você, eu tinha um módulo contendo outros módulos e não exportei (falando no texto digitado) os outros módulos.


1

Eu também tive esse problema com AOT ativado. Adicionei um novo arquivo de serviço. Reiniciei o compilador e o problema foi resolvido.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.