es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Afirmación del comportamiento de un controlador de un evento de EventEmitter.

Soy nuevo en Jest, lo siento si esta es una pregunta trivial, pero he revisado la documentación oficial de Jest y no he sido capaz de encontrar una solución al problema.

Estoy desarrollando una aplicación muy simple en Nodejs que consume datos de un websocket y los propaga a un conjunto de consumidores a través de zeromq.

El código es el siguiente:

app.js:

const initializer = require("./dependencyInitializer");

const sock = initializer.zmqSock();
const ws = initializer.wsClient();

ws.on('update', data => {
  sock.send([data.topic, JSON.stringify(data)]);
});

El cliente websocket es una clase de una librería de terceros que extiende de EventEmitter.

Me gustaría crear una prueba que asegure que la función sock.send es llamada exactamente una vez en el manejador del evento ‘update’.

Este es mi enfoque:

app.spec.js:

const ws = require("./app");
const initializer = require("./dependencyInitializer");

jest.mock("./dependencyInitializer", () => {
    return {
        wsClient: jest.fn(() => {
            const EventEmitter = require("events")
            const emitter = new EventEmitter()

        return emitter;
    }),
    zmqSock: jest.fn(() => {
        return {
            send: jest.fn()
        }
    })
}


});
describe('on message received from websocket',() => {
    it('should pass it to zmq', () => {
        const data = {result: "ok"};

    expect(initializer.wsClient).toHaveBeenCalledTimes(1);
    expect(initializer.zmqSock).toHaveBeenCalledTimes(1);

    const _sock = initializer.zmqSock();
    const _ws = initializer.wsClient();
    _ws.emit("update", data);
    expect(_sock.send).toHaveBeenCalledTimes(1);
});


});

El test falla con el siguiente mensaje:

on message received from websocket › should pass it to zmq

expect(jest.fn()).toHaveBeenCalledTimes(expected)

Número de llamadas esperadas: 1
Número de llamadas recibidas: 0

  28 |         const _ws = initializer.wsClient();
  29 |         _ws.emit("update", data);
> 30 |         expect(_sock.send).toHaveBeenCalledTimes(1);
     |                            ^
  31 |     });
  32 | });


No estoy seguro si estoy en el camino correcto, me gustaría entender cuál sería el mejor enfoque para desarrollar una prueba como esta.

Gracias

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás en el camino correcto con tu enfoque. El problema que tienes es que en realidad no estás llamando las funciones wsClient y zmqSock en tu prueba. Solo las estas simulando, así que cuando llamas _ws.emit("update", data) no estas llamando en realidad la función send.

    Para solucionar esto, necesitas llamar las funciones wsClient y zmqSock en tu prueba. Puedes hacerlo agregando las siguientes líneas a tu prueba:

    const _sock = initializer.zmqSock();
    const _ws = initializer.wsClient();
    

    Esto llamará a las funciones simuladas y te permitirá probar la función send.

Comments are closed.