mockReturnValue()とmockResolvedValue()


mockReturnValue()とmockResolvedValue()で勘違いしていたことがあったので書いておく

// モックがPromise<void>を返すようにしておく
mockfn.mockReturnValue(Promise.resolve());

mockfnがrejectを返すケースを確認したいと思い以下のようにした
mockfn.mockRejectedValueOnce();

ここで勘違いしていて、
mockRejectedValueOnce()は一度呼ぶ時にデフォルトで設定しているほうではなく、こちらのモックの結果を優先してくれると思っていた

実際は、
mockReturnValue()mockReturnValueOnce()で、
mockResolvedValue() mockRejectedValue()mockResolvedValueOnce() mockRejectedValueOnce()
一度呼んだ時にOnceで設定している値を返して、そのあとはデフォルトを返すようになる
デフォルトで返すのがmockReturnValue()のときは、一度呼んだときに返すものを設定するのはmockReturnValueOnce()でないとできない

こんな感じ

const mockfn = jest.fn();
mockfn.mockReturnValue(1);
mockfn.mockReturnValueOnce(2);

mockfn() // 2
mockfn() // 1

mockfn.mockResolvedValue(1);
mockfn.mockResolvedValueOnce(2);

await mockfn() // 2
await mockfn() // 1

mockfn.mockReturnValue(Promise.resolve(1));
mockfn.mockResolvedValueOnce(2);

await mockfn() // 1
await mockfn() // 1

そもそもなぜmockReturnValuemockResolvedValueを混在しようとしたのかと過去の自分になんで??と思ったけれど
こういう仕組みになっているんだということがわかってよかった

どうしてもmockReturnValueにしていたものをmockResolvedValueにしたい場合はmockfn.mockReset()を使ってmockfn.mockを置き換えるようにする