Recibo un error cuando ejecuto una prueba unitaria con jasmine en la aplicación angular8. Tengo un servicio y dentro de este servicio estoy inyectando otro servicio.
@Injectable({ providedIn: 'root' }) export class FirstService { constructor(private http: HttpClient, private configService: ConfigurationService) { }cuando hago la prueba de ejecución de npm, siempre recibo un error:
Se produjo un error en afterAll ReferenceError: no se puede acceder a 'ConfigurationService' antes de la inicialización en Module.ConfigurationService ( http://localhost:9876/_karma_webpack_/main.js:1095:112 )
¿Alguna ayuda?
Debería proporcionar una simulación de ConfigService porque es una dependencia de FirstService . La forma más fácil de hacerlo es con un espía.
Algo como:
let firstService: FirstServicec; let configServiceSpy: jasmine.SpyObj<ConfigService>; beforeEach(() => { const spy = jasmine.createSpyObj('ConfigService', ['getValue']); TestBed.configureTestingModule({ providers: [ FirstService, { provide: ConfigService, useValue: spy } ] }); // Inject both the service-to-test and its (spy) dependency configService = TestBed.get(ConfigService); configServiceSpy = TestBed.get(ValueService); });Luego, puedes consumir el espía en la prueba como:
it('#getValue should return stubbed value from a spy', () => { const stubValue = 'stub value'; configServiceSpy.getValue.and.returnValue(stubValue); expect(firstService.getValue()) .toBe(stubValue, 'service returned stub value'); expect(configServiceSpy.getValue.calls.count()) .toBe(1, 'spy method was called once'); expect(configServiceSpy.getValue.calls.mostRecent().returnValue) .toBe(stubValue); });Para obtener más información, consulte esta sección de Angular Docs
Este puede ser un mensaje de error muy engañoso.
Una dependencia circular puede estar causándolo, ¡resuelva sus dependencias circulares!
No verá una advertencia de dependencia circular cuando ejecute 'npm run test', pero recibirá una advertencia cuando ejecute 'npm run serve' o 'npm run build'.
En mi caso, fue un error muy estúpido. Estaba usando servicios abstractos y cosas de useClass y tenía algo como esto en un archivo:
constructor(@Optional() private readonly baseService: BaseService) { } export abstract class BaseService { public abstract doSomething(): void; }Cambiando el orden a
export abstract class BaseService { public abstract doSomething(): void; } constructor(@Optional() private readonly baseService: BaseService) { }resolvió el problema. DIOS MÍO.