recargar que pasar parametros otro importar entre ejemplo comunicacion componentes componente angular karma-jasmine angular2-services angular2-testing angular2-injection

pasar - que es un observable angular



Prueba: no se pueden resolver todos los parĂ¡metros para(ClassName) (2)

Contexto

ApiService una clase ApiService para poder manejar nuestras consultas API personalizadas, mientras usamos nuestro propio serializador + otras características.

La firma del constructor de ApiService es:

constructor(metaManager: MetaManager, connector: ApiConnectorService, eventDispatcher: EventDispatcher);

  • MetaManager es un servicio inyectable que maneja los metadatos de la API.
  • ApiConnectorService es un servicio que está envolviendo Http para agregar nuestros encabezados personalizados y sistema de firma.
  • EventDispatcher es básicamente el sistema de despacho de eventos de Symfony, en mecanografiado.

Problema

Cuando ApiService el ApiService , hago una inicialización en beforeEach :

beforeEach(async(() => { TestBed.configureTestingModule({ imports : [ HttpModule ], providers: [ ApiConnectorService, ApiService, MetaManager, EventDispatcher, OFF_LOGGER_PROVIDERS ] }); }));

y funciona bien

Luego agrego mi segundo archivo de especificaciones, que es para ApiConnectorService , con esto beforeEach :

beforeEach(async(() => { TestBed.configureTestingModule({ imports : [HttpModule], providers: [ ApiConnectorService, OFF_LOGGER_PROVIDERS, AuthenticationManager, EventDispatcher ] }); }));

Y todas las pruebas fallan con este error:

Error: no se pueden resolver todos los parámetros para ApiService: (MetaManager,?, EventDispatcher).

  • Si ApiConnectorService api-connector-service.spec.ts (archivo de especificaciones de ApiConnectorService ) de mis pruebas cargadas, las pruebas de ApiService tendrán éxito.
  • Si ApiService api-service.spec.ts (archivo de especificaciones de ApiService ) de mis pruebas cargadas, las pruebas de ApiConnectorService tendrán éxito.

¿Por qué tengo este error? Parece que el contexto entre mis dos archivos está en conflicto y no sé por qué y cómo solucionarlo.


El problema no se resolvió realmente en la respuesta elegida, que en realidad es solo una recomendación para escribir pruebas, sino en los comentarios, y debe seguir un enlace y buscarlo allí. Como tuve otro problema con el mismo error, agregaré ambas soluciones aquí.

  1. Solución al problema del OP:

Si tiene un barril (index.ts o multi exportar archivo) como este:

export * from ''my.component'' // using my.service via DI export * from ''my.service''

Entonces podría obtener un error como EXCEPTION: Can''t resolve all parameters for MyComponent: (?) .

Para solucionarlo, debe exportar el servicio antes del componente:

export * from ''my.service'' export * from ''my.component'' // using my.service via DI

  1. Solución a mi problema:

El mismo error puede ocurrir debido a una circular dependency que causa una importación de servicio undefined . Para verificar, console.log(YourService) después de importarlo (en su archivo de prueba, donde está ocurriendo el problema). Si no está definido, puede haber creado un archivo index.ts (barril) exportando tanto el servicio como el archivo que lo usa (componente / efecto / lo que sea que esté probando) - importando el servicio desde el archivo de índice donde ambos se exportan ( haciendo un círculo completo).

Busque ese archivo e importe el servicio que necesita directamente desde your.service.ts archivo.service.ts en lugar del índice.


Es porque el servicio Http no se puede resolver desde el HttpModule , en un entorno de prueba. Depende del navegador de la plataforma. Ni siquiera deberías tratar de hacer llamadas XHR de todos modos durante las pruebas.

Por este motivo, Angular proporciona un MockBackend para que lo MockBackend el servicio de Http . Usamos este backend simulado para suscribir conexiones en nuestras pruebas, y podemos simular la respuesta cuando se realiza cada conexión.

Aquí hay un breve ejemplo completo del que puede trabajar sin

import { Injectable } from ''@angular/core''; import { async, inject, TestBed } from ''@angular/core/testing''; import { MockBackend, MockConnection } from ''@angular/http/testing''; import { Http, HttpModule, XHRBackend, ResponseOptions, Response, BaseRequestOptions } from ''@angular/http''; @Injectable() class SomeService { constructor(private _http: Http) {} getSomething(url) { return this._http.get(url).map(res => res.text()); } } describe(''service: SomeService'', () => { beforeEach(() => { TestBed.configureTestingModule({ providers: [ { provide: Http, useFactory: (backend, options) => { return new Http(backend, options); }, deps: [MockBackend, BaseRequestOptions] }, MockBackend, BaseRequestOptions, SomeService ] }); }); it(''should get value'', async(inject([SomeService, MockBackend], (service: SomeService, backend: MockBackend) => { backend.connections.subscribe((conn: MockConnection) => { const options: ResponseOptions = new ResponseOptions({body: ''hello''}); conn.mockRespond(new Response(options)); }); service.getSomething(''http://dummy.com'').subscribe(res => { console.log(''subcription called''); expect(res).toEqual(''hello''); }); }))); });