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

168
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 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