Tengo un error en mis pruebas de Karma en mi aplicación Angular. El error es cuando ejecuto mis pruebas:
Failed: Property activePropertyChanged does not have access type get
Estoy tratando de simular un servicio llamado ModuleSpecService . En este servicio existe el siguiente getter:
get activePropertyChanged(): Observable<SpecificationPropertyObject> { return this.activePropChangedSubject.asObservable(); } Y en mi archivo de spec me burlo así:
spyOnProperty(moduleSpecServiceMock, 'activePropertyChanged', 'get').and.returnValue(of()); // then, in configureTestingModule() I define/mock the service like this: providers: [{ provide: ModuleSpecService, useValue: moduleSpecServiceMock }] Así que claramente hay un captador en mi servicio del que quiero burlarme. Si elimino la línea con spyOnProperty() arroja el siguiente error:
TypeError: this.moduleSpecService.activePropertyChanged.subscribe is not a function
así que definitivamente necesito el simulacro.
¿Alguna idea de lo que podría salir mal?
Como esto parece ser un error en jasmine, logré solucionarlo con una solución alternativa:
En lugar de esto:
spyOnProperty(moduleSpecServiceMock, 'activePropertyChanged', 'get').and.returnValue(of());Definí la propiedad así:
(moduleSpecServiceMock as any).activePropertyChanged = of(); Tuve que lanzarlo como any , porque si no, me dijo (correctamente) que activePropertyChange es una propiedad read-only (ya que solo tiene un getter).
No es la mejor solución, pero al menos funciona :)
Puede utilizar la sintaxis de propagación:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
const moduleSpecServiceMock = { ...jasmine.createSpyObj('moduleSpecServiceMock ', ['']), activePropertyChanged: of() } as jasmine.SpyObj; Esto le permite establecer propiedades privadas y captadores sin necesidad de as any sintaxis.
Un gran beneficio de esto es que si refactoriza el nombre del captador, la propiedad de prueba también se actualizará, con as any sintaxis, perderá los tipos y la capacidad de refactorizar.
Solucioné ese error, creando una propiedad get en el servicio , así que:
Archivo .spec.ts :
spyOnProperty(moduleSpecServiceMock, 'activePropertyChanged', 'get').and.returnValue(of("Test")); Archivo .service.ts :
get activePropertyChanged(): Observable<any> { return of({...element}); }