Tengo algunas pruebas de Jest que pasan cuando se ejecutan individualmente pero fallan cuando se ejecutan juntas. Por lo que puedo decir, las pruebas son independientes, pero deben estar interactuando de alguna manera que me estoy perdiendo.
Las pruebas están probando un adaptador de conexión que intenta conectarse a un dispositivo BLE varias veces y solo devuelve una única conexión pendiente que se puede esperar o cancelar.
Aquí están las pruebas:
test("connect returns pending connection", async () => { const adaptor = new MockAdaptor(); const pendingConnection = adaptor.connect("test"); expect(pendingConnection.id).toBe("test"); await pendingConnection.cancel(); }) test('connect success', async () => { const adaptor = new MockAdaptor(); const pendingConnection = adaptor.connect("test"); // TEST FAILING HERE const connection = await pendingConnection.connectionPromise as any; expect(connection).toBe("test"); })Aquí está el código compartido por las pruebas:
const getSuccessfulPendingConnection = () => ({ address: "test", connectionPromise: new Promise((resolve, _) => { setTimeout(() => resolve("test"), 1000) }), cancel: async () => {} }) const getFailedPendingConnection = () => ({ address: "test", connectionPromise: new Promise((_, reject) => { setTimeout(() => reject("connect failed"), 1000); }), cancel: async () => {} }) const getMockPendingConnection = (id: string) => { if(id === "test") { return getSuccessfulPendingConnection(); } return getFailedPendingConnection(); } class MockAdaptor { connect(id: string) { let rejectPromise = () => {}; let cancelConnection = async () => {}; let connectionCancelled = false; const connectionPromise = new Promise(async (resolve, reject) => { rejectPromise = () => { reject("Connection cancelled") connectionCancelled = true; }; let newConnection = undefined; while(!connectionCancelled) { try { const pendingConnection = getMockPendingConnection(id); cancelConnection = pendingConnection.cancel; newConnection = await pendingConnection.connectionPromise; return resolve(newConnection); } catch (error) { console.log('Connection failed', error); } } }); const cancel = async () => { rejectPromise(); await cancelConnection(); } return { id, connectionPromise, cancel, } } }Cuando ejecuto estas pruebas juntas, 'conexión devuelve conexión pendiente' pasa, pero 'conexión exitosa' falla con el mensaje "Conexión cancelada".