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
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
yzmqSock
en tu prueba. Solo las estas simulando, así que cuando llamas_ws.emit("update", data)
no estas llamando en realidad la funciónsend
.Para solucionar esto, necesitas llamar las funciones
wsClient
yzmqSock
en tu prueba. Puedes hacerlo agregando las siguientes líneas a tu prueba:Esto llamará a las funciones simuladas y te permitirá probar la función
send
.