Estoy trabajando con Electron y Johnny-Five para procesar algunos datos que leo con mi Arduino Mega 2560 y tengo algunos problemas para probar la conexión de mi Arduino.
Este es el método que quiero probar (ignore la horrible firma):
export let board: Board | null = null; export function setArduinoBoard(f: (num: number, ...etc: any[]) => void, num: number, ...etc: any[]) { if (board == null) board = new Board({...}); board = board.on("ready", () => f(num, etc)); }Y esta es mi prueba:
describe.only("setArduinoBoard()", function() { it("can communicate with the Arduino device", function(done) { const f = (num: number) => console.log(num); const spy = sinon.spy(f); setArduinoBoard(f, 0); assert(spy.called); done(); }); });Lo que quiero es que la afirmación espere hasta que se haya llamado a la función. Y sé que eventualmente se llama porque la consola genera 0, pero solo después de que falla la afirmación.
El enfoque típico sería mover la devolución de llamada done al controlador de eventos. De esta manera, la prueba esperará hasta que se llame a la devolución de llamada. Si el evento ready no se activa, no se llamará a la devolución de llamada y la prueba expirará con un error después de 2 segundos.
Esto significa que no necesita afirmar explícitamente que se llama al evento f y, de hecho, no necesita espiarlo.
it("can communicate with the Arduino device", function(done) { const f = (num: number) => { console.log(num); done(); }; setArduinoBoard(f, 0); }); Si necesita afirmar algo después de que se done activado el evento ready , puede agregar una afirmación en el controlador de eventos y usar un bloque catch para capturar excepciones y pasarlas a la devolución de llamada.
it("can communicate with the Arduino device", function(done) { const f = (num: number) => { try { assert.equal(num, 0); done(); return; } catch (err) { done(err); } }; setArduinoBoard(f, 0); });