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

171
Views
Espiar funciones sin objetos

Estoy probando un método de publicación en una subclase de pub. Estoy creando una función de devolución de llamada dentro de la función beforeEach y me suscribo a la clase. En el método it, estoy publicando el evento e intentando probar que se llamó a la devolución de llamada, que es básicamente cómo funciona la clase. Tengo la prueba funcionando y pasa, pero el problema es que tuve que usar un setTimeout para que esto funcione. Creo que esta probablemente no sea la forma correcta de hacerlo.

 describe('publish', () => { let testpublish; let callback; beforeEach(() => { callback = function(data) { return data + 10; } testpublish = { 'id': 'testpublish1', 'event': 'testpublish', 'callback': callback }; subject.subscribe(testpublish); }); it('should call the subscription function', () => { subject.publish('testpublish', 9); setTimeout(() => { expect(callback).toEqual(19); }); }); });

Inicialmente, quería espiar la devolución de llamada solo para ver si se llamaba, pero la documentación de Jasmine dice que debo colocar mi método en un objeto:

spyOn(obj, nombre del método) → {Spy}

Cualquier consejo sobre una mejor manera de hacer esto sería apreciado. Gracias.

¿Clase PubSub si es útil?

 @Injectable() export class Pubsub { private events: any = {}; public subscribe(config: any) { let event = config['event']; this.events[event] = this.events[event] || []; if (this.events[event].length < 1) { this.events[event].push(config); } else { for (let i = 0; i < this.events[event].length; i++) { if (this.events[event][i].id !== config.id) { this.events[event].push(config); } } } } public unsubscribe(obj: Object) { let event = obj['event']; let id = obj['id']; if (this.events[event]) { this.events[event] = this.events[event].filter((eventObj) => { return eventObj.id !== id; }); } if (this.events[event].length === 0) { delete this.events[event]; } } public publish(event: string, data: any) { if (this.events[event]) { this.events[event].forEach(function(obj) { obj.callback(data); }); } } public getEvents() { return this.events; } }
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

La función existente no se puede espiar, porque un espía es una función nueva y la referencia a la función original ya se usa en el lugar donde se llama.

Teniendo en cuenta que la función de callback de llamada se define en la prueba en sí, no dentro de la aplicación, debe definirse como un espía en primer lugar:

 callback = jasmine.createSpy();

Ni siquiera tiene que hacer algo porque su valor de retorno no agrega valor a la prueba.

Y se prueba como

 const arg = {}; subject.publish('testpublish', arg); expect(callback.calls.count()).toBe(1); expect(callback.calls.first().args[0]).toBe(arg);

publish es síncrono, así como el resto de la clase. No hay necesidad de setTimeout , y es dañino aquí. Cuando el parámetro done no se especifica para la prueba, se considera síncrono y setTimeout hace que las afirmaciones se ignoren en esta prueba.

Este

 it('should pass', () => { setTimeout(() => { expect(1).toBe(2); }); });

siempre pasará Y solo si la suite no tiene otras pruebas, esto activará la advertencia SPEC HAS NO EXPECTATIONS .

over 4 years ago · Santiago Trujillo Report

0

jasmine.createSpy('spy') funcionará.

 describe('publish', () => { let testpublish; let callback; let subject = new Pubsub(); beforeEach(() => { callback = function (data) { return data + 10; } testpublish = { 'id': 'testpublish1', 'event': 'testpublish', 'callback': jasmine.createSpy('spy') }; subject.subscribe(testpublish); }); it('should call the subscription function', () => { subject.publish('testpublish', 9); expect(testpublish.callback).toHaveBeenCalledWith(9); }); });
over 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!