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
そもそもなぜmockReturnValue
とmockResolvedValue
を混在しようとしたのかと過去の自分になんで??と思ったけれど
こういう仕組みになっているんだということがわかってよかった
どうしてもmockReturnValue
にしていたものをmockResolvedValue
にしたい場合はmockfn.mockReset()
を使ってmockfn.mock
を置き換えるようにする