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á envolviendoHttp
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 deApiConnectorService
) de mis pruebas cargadas, las pruebas deApiService
tendrán éxito. - Si
ApiService
api-service.spec.ts
(archivo de especificaciones deApiService
) de mis pruebas cargadas, las pruebas deApiConnectorService
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í.
- 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
- 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'');
});
})));
});