Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

184
Vistas
¿Necesito darme de baja de las suscripciones en mis pruebas unitarias?

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?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

@estus es correcto, no es necesario darse de baja.

tl;dr;

  • Los Observables/Sujetos mantienen referencias a todos los suscriptores hasta que se completan.
  • Los objetos con referencias activas no se pueden marcar para la recolección de basura. JS básico.
  • 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 sin usar a la memoria.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda