Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

250
Views
¿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?

about 4 years ago · Santiago Trujillo
1 answers
Answer question

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 y sin usar a la memoria.

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!