requestAnimationFrame + jest-electron causes unstable behavoir includes crush of elecron.
To replace requestAnimationFrame with setTimeout solves the problem for now.
solution ts
beforeEach(() => {
  jest.spyOn(window, "requestAnimationFrame").mockImplementation(callback => {
    return setTimeout(callback, 0);
  });
});
 
afterEach(() => {
  window.requestAnimationFrame.mockRestore();
});- OK ts
 
test("promise", async () => {
  let _resolve: (arg: unknown) => void;
  const p = new Promise(res => {
    _resolve = res;
  }).then(() => {
    console.log("resolved");
  });
  _resolve!(0);
  await p;
});- resolved / 
Timeout - Async callback was not invoked within the 5000ts 
test("promise", async () => {
  let _resolve: (arg: unknown) => void;
  const p = new Promise(res => {
    _resolve = res;
  }).then(() => {
    console.log("resolved");
  });
  requestAnimationFrame(() => {
    _resolve!(0);
  });
  await p;
});- OK ts
 
test("promise", async () => {
  let _resolve: (arg: unknown) => void;
  const p = new Promise(res => {
    _resolve = res;
  }).then(() => {
    console.log("resolved");
  });
  requestAnimationFrame(() => {
    _resolve!(0);
  });
  await p;
  console.log("ok");
});- resolved / Timeout ts
 
test("promise", async () => {
  let _resolve: (arg: unknown) => void;
  const p = new Promise(res => {
    _resolve = res;
  }).then(() => {
    console.log("resolved");
  });
  requestAnimationFrame(() => {
    _resolve!(0);
  });
  await p;
  expect(1).toBe(1);
});- Unstable Behavoir: Fails as expected, crush, or Timeout ts
 
test("promise", async () => {
  let _resolve: (arg: unknown) => void;
  const p = new Promise(res => {
    _resolve = res;
  }).then(() => {
    console.log("resolved");
  });
  requestAnimationFrame(() => {
    _resolve!(0);
  });
  await p;
  expect(1).toBe(0);
});- 
- Timeout
    - 
change requestAnimationFrame to setTimeout
- OK ts
 
test("promise", async () => {
  let _resolve: (arg: unknown) => void;
  const p = new Promise(res => {
    _resolve = res;
  }).then(() => {
    console.log("resolved");
  });
  setTimeout(() => {
    _resolve!(0);
  });
  await p;
});- OK ts
 
test("promise", async () => {
  let _resolve: (arg: unknown) => void;
  const p = new Promise(res => {
    _resolve = res;
  }).then(() => {
    console.log("resolved");
  });
  setTimeout(() => {
    _resolve!(0);
  });
  await p;
  expect(1).toBe(1);
});solution ts
beforeEach(() => {
  jest.spyOn(window, "requestAnimationFrame").mockImplementation(callback => {
    return setTimeout(callback, 0);
  });
});
 
afterEach(() => {
  window.requestAnimationFrame.mockRestore();
});This page is auto-translated from [/nishio/requestAnimationFrame + jest-electron = unstable behavoir](https://scrapbox.io/nishio/requestAnimationFrame + jest-electron = unstable behavoir) using DeepL. If you looks something interesting but the auto-translated English is not good enough to understand it, feel free to let me know at @nishio_en. I’m very happy to spread my thought to non-Japanese readers.