6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

mockReturnValue()とmockResolvedValue()

Last updated at Posted at 2020-01-23

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を置き換えるようにする

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?