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);
-
MetaManageres un servicio inyectable que maneja los metadatos de la API. -
ApiConnectorServicees un servicio que está envolviendoHttppara agregar nuestros encabezados personalizados y sistema de firma. -
EventDispatcheres 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
ApiConnectorServiceapi-connector-service.spec.ts(archivo de especificaciones deApiConnectorService) de mis pruebas cargadas, las pruebas deApiServicetendrán éxito. - Si
ApiServiceapi-service.spec.ts(archivo de especificaciones deApiService) de mis pruebas cargadas, las pruebas deApiConnectorServicetendrá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'');
});
})));
});