const getRate = jest.fn()
.mockResolvedValue(1.0)
.mockResolvedValueOnce(1.2)
.mockResolvedValueOnce(1.5);
const a = await getRate();
const b = await getRate();
const c = await getRate();
const d = await getRate();
1.2, 1.5, 1.0, 1.0
Jest puts the once-values in a queue and uses them first, in order. It does this wherever mockResolvedValue sits in the chain. When the queue is empty, Jest uses the default from mockResolvedValue. So the later calls keep resolving 1.0. That is why "1.2, 1.5, undefined, undefined" is wrong: the default fills in after the queue runs out.
Read more