Si tengo una prueba como la siguiente:
it('should return some observable', async(() => { mockBackend.connections.subscribe((mockConnection: MockConnection) => { const responseOptions = new ResponseOptions({ body: JSON.stringify(/* some response */) }); mockConnection.mockRespond(new Response(responseOptions)); }); service.getSomeObservable() .subscribe(result => { expect(result).toBe(/* expected response */); }); })); ¿Necesito darme de baja de la suscripción en un bloque afterEach o afterAll para evitar problemas de memoria? ¿O se eliminará automáticamente?
@estus es correcto, no es necesario darse de baja.
tl;dr;
Http Observables se completa, ignorando las suscripciones en ese momento y liberándolas para GC.
Hasta que el Observable/Sujeto se elimine o se complete, no se puede realizar ninguna suscripción en GC a menos que se dé de baja.
Considere esta sencilla configuración de Angular TestBed:
describe(`DataService`, () => { let service: DataService; let httpMock: HttpTestingController; beforeEach(() => { TestBed.configureTestingModule({ imports: [HttpClientTestingModule], providers: [ DataService, ] }); service = TestBed.get(DataService); httpMock = TestBed.get(HttpTestingController); }); it(`should get a response`, () => { service.getData().subscribe(response => { expect(response).toBeTruthy(); }); }); En el caso de una solicitud Http a través de Angular HttpClient , el Observable se completará y las referencias a los Suscriptores se liberarán para GC. En el caso de las pruebas generales de Angular Jasmine como se muestra arriba, incluso si tenía un Observable que no se completó, el objeto DataService al que hace referencia el service se restablece cada vez beforeEach se llama a cada uno, y el antiguo objeto DataService habrá perdido todo. referencias y está marcado para GC. Una vez que eso suceda, cualquier suscripción a la que haga referencia el Observable/Subject en el DataService perderá las referencias a ellos y también se incluirán en GC.
Recuerde, las fugas de memoria ocurren con los Observables porque retienen referencias a todos los Suscriptores y a menos que el Suscriptor cancele la suscripción. Continuarán teniendo referencias válidas a ellos y a las funciones que los contienen, y no se pueden marcar para GC hasta que se destruya The Subject/Observable. Si el Sujeto continúa vivo y sigue agregando suscriptores, como una nueva instancia del mismo Suscriptor, seguirá agregando un montón de objetos antiguos y sin usar a la memoria.